У меня есть хэш пароля, который хранится в таблице и помещается там следующим coldfusion сценарием -
#Hash(Encrypt(Form.UserPassword,GetSiteVars.EnCode))#
Я пытаюсь добавить некоторую внешнюю функциональность в рамках c# приложения. Я хотел бы смочь использовать в своих интересах данные, которые уже существуют так, чтобы я мог аутентифицировать пользователей. Кто-либо знает, как я могу копировать вышеупомянутое coldfusion код в c#?
Спасибо за любые мысли.
Я оставлю исходное содержание ответа ниже для исторической справки, но следует отметить, что это НЕ рабочий ответ на исходный вопрос .
Вместо этого, посмотрите ответ, получивший наибольшее количество голосов в этой ветке от @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))#
MD5 - алгоритм хеширования по умолчанию для hash ()
. Я не программист на C #, но создать хэш MD5 для сравнения с результатом ColdFusion не составит большого труда.
Что касается encrypt ()
, есть ли причина, по которой вы шифруете имя пользователя перед его хешированием? Я не могу придумать какой-либо пользы от этого, но это не значит, что ее нет. Я бы просто сделал:
Hash( UCase( GetPass.username ) )
Что должно быть проще воспроизвести на C #.
Одно из решений - заставить БД выполнять хеширование и шифрование, это может быть проще ...
По умолчанию "шифрование" в CF - это просто XOR:
ciphertext = base64_encode (plaintext ^ key)
Итак, чтобы расшифровать:
plaintext = base64_decode (ciphertext) ^ key
Как уже упоминалось, хеш по умолчанию - md5.
Редактировать:
Что ж, дальнейшие исследования показывают, что это неправда - это всего лишь один из тех широко распространенных мифов.
Я не могу найти никакой документации по фактическому алгоритму для метода шифрования CFMX_COMPAT.
Извините за погоню за дикими гусями.