Функция PHP crypt () в .Net? - PullRequest
       31

Функция PHP crypt () в .Net?

7 голосов
/ 05 декабря 2008

Я переписываю PHP-сайт в ASP.NET MVC. Я хотел бы сохранить ту же базу пользователей, но пароли хешируются с помощью функции PHP crypt (). Мне нужна та же функция в .Net, чтобы я мог хэшировать пароль при входе в систему и проверять его по хешированному паролю в базе данных пользователей.

В этом случае crypt использует реализацию CRYPT_MD5 - все хэши начинаются с $ 1 $

Я пробовал Phalanger, но у него нет реализации функции crypt на MD5.

Кто-нибудь знает один из них в .Net? Пример crypt () на C # в CodeProject использует DES, а не MD5.

Я пробовал следующий код в C #, с различными перестановками соли + пароль, пароль + соль и соль с префиксом $ 1 $ и суффиксом $ и без него. Ни один из них не дает такой же результат, как PHP:

static void Main(string[] args)
{
    const string salt = "somesalt";
    const string password = "fubar";
    const string plaintextString = password + salt;
    byte[] plaintext = GetBytes(plaintextString);
    var md5 = MD5.Create("MD5");
    byte[] hash = md5.ComputeHash(plaintext);
    string s = System.Convert.ToBase64String(hash);
    Console.WriteLine("Hash of " + password + " is " + s);
    Console.ReadKey();
}

private static byte[] GetBytes(string s)
{
    var result = new byte[s.Length];
    for (int i = 0; i < s.Length; i++)
        result[i] = (byte)s[i];
    return result;
}

Ответы [ 5 ]

2 голосов
/ 05 декабря 2008

Существует несколько методов .NET для хеширования md5, System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format) является самым простым в использовании, хотя и полным ртом. Просто передайте "md5" как формат.

В зависимости от того, как PHP это делает, это может быть так же просто, как отрезать $1$ от начала хеша при его импорте. Это может быть более сложным. Если вы можете опубликовать пример пароля / хэша, я посмотрю, смогу ли я придумать какой-нибудь C #, который генерирует тот же хеш из этого пароля для вас.

1 голос
/ 05 декабря 2008

Это выглядит многообещающе, по крайней мере.

unix md5crypt для CRYPT_MD5 с $1$ солями.

( C # реализация Unix crypt () для DES)

1 голос
/ 05 декабря 2008

Вы смотрели на .NET MD5 класс ? $ 1 $ является частью соли из 12 символов.

0 голосов
/ 26 июля 2010

Единственное решение, которое я нашел, было вызвать тривиальный скрипт PHP, который просто выполняет хэш входной строки и возвращает его: - (

0 голосов
/ 26 июля 2010

Я сейчас работаю над точно такой же проблемой. Решение, которое я придумал, состояло в том, чтобы вызвать функцию php напрямую через внешний вызов:

[DllImport( "php5ts.dll", EntryPoint = "crypt", CharSet = CharSet.Ansi )]
private static extern string crypt( string str, string salt );

Это хорошо работает для php версии 5.2.10 при запуске локального сервера WebDev, IIS5 и IIS6, но если вы используете II7, рабочий процесс ASP.Net завершается с необработанным исключением. (Я обновлю свой ответ, как только найду решение)

Мы также включили флаг типа пароля, чтобы позволить нам использовать реализацию .Net MD5 для всех новых пользователей и беспрепятственно преобразовывать существующих пользователей, когда они обновляют свои данные.

Обновление: Вероятно, проблема с обращением к php5ts.dll напрямую из IIS7 сводится к использованию 64-битных окон, поэтому это решение может работать на 32-битной установке Windows 7 или Server 2008, однако Я не могу проверить это. Как выяснилось, наш существующий сайт использовал DES, поэтому мы смогли использовать реализацию крипта от CodeProject, спасибо за ссылку, Майк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...