Сравните хэши пароля между C# и ColdFusion (CFMX_COMPAT)

У меня есть хэш пароля, который хранится в таблице и помещается там следующим coldfusion сценарием -

#Hash(Encrypt(Form.UserPassword,GetSiteVars.EnCode))#

Я пытаюсь добавить некоторую внешнюю функциональность в рамках c# приложения. Я хотел бы смочь использовать в своих интересах данные, которые уже существуют так, чтобы я мог аутентифицировать пользователей. Кто-либо знает, как я могу копировать вышеупомянутое coldfusion код в c#?

Спасибо за любые мысли.

6
задан Shawn Holmes 21 December 2012 в 22:58
поделиться

4 ответа

Я оставлю исходное содержание ответа ниже для исторической справки, но следует отметить, что это НЕ рабочий ответ на исходный вопрос .

Вместо этого, посмотрите ответ, получивший наибольшее количество голосов в этой ветке от @Terrapin в январе 2011 года. Я надеюсь, что OP это заметит и сможет изменить принятый ответ. Черт возьми, я даже помечу моды, чтобы посмотреть, можно ли что-нибудь с этим поделать.


Основываясь на ответе Эдварда Смита и последующих комментариях Чурски, вот мое решение.

Во-первых, вам понадобится функция XOR в C #, которую я взял из здесь и немного изменил.

using System;
using System.Collections.Generic;
using System.Text;

namespace SimpleXOREncryption
{    
    public static class EncryptorDecryptor
    {
        public static string EncryptDecrypt(string textToEncrypt, int key)
        {            
            StringBuilder inSb = new StringBuilder(textToEncrypt);
            StringBuilder outSb = new StringBuilder(textToEncrypt.Length);
            char c;
            for (int i = 0; i < textToEncrypt.Length; i++)
            {
                c = inSb[i];
                c = (char)(c ^ key);
                outSb.Append(c);
            }
            return outSb.ToString();
        }   
    }
}

Затем возьмите результат XOR и закодируйте его с помощью base-64. После того, как у вас есть эта строка, MD5 хеширует ее. Результат должен соответствовать результату из исходного фрагмента кода:

#Hash(Encrypt(Form.UserPassword,GetSiteVars.EnCode))#
2
ответ дан 8 December 2019 в 13:45
поделиться

MD5 - алгоритм хеширования по умолчанию для hash () . Я не программист на C #, но создать хэш MD5 для сравнения с результатом ColdFusion не составит большого труда.

Что касается encrypt () , есть ли причина, по которой вы шифруете имя пользователя перед его хешированием? Я не могу придумать какой-либо пользы от этого, но это не значит, что ее нет. Я бы просто сделал:

Hash( UCase( GetPass.username ) )

Что должно быть проще воспроизвести на C #.

3
ответ дан 8 December 2019 в 13:45
поделиться

Одно из решений - заставить БД выполнять хеширование и шифрование, это может быть проще ...

1
ответ дан 8 December 2019 в 13:45
поделиться

По умолчанию "шифрование" в CF - это просто XOR:

ciphertext = base64_encode (plaintext ^ key)

Итак, чтобы расшифровать:

plaintext = base64_decode (ciphertext) ^ key

Как уже упоминалось, хеш по умолчанию - md5.

Редактировать:

Что ж, дальнейшие исследования показывают, что это неправда - это всего лишь один из тех широко распространенных мифов.

Я не могу найти никакой документации по фактическому алгоритму для метода шифрования CFMX_COMPAT.

Извините за погоню за дикими гусями.

1
ответ дан 8 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: