2010-05-31 4 views
5

Я сейчас пытаюсь обновить проект шахты с .NET 3.5 для .NET 4.0SHA1CryptoServiceProvider изменен в .NET 4

Все шло очень хорошо, весь код скомпилирован, прошел все тесты.
Затем я столкнулся с проблемой развертывания в моей промежуточной среде.
Внезапно мои логины перестали работать.

Кажется, мои SHA1 хэшируются пароли быть хэшируются по-разному в .NET 4.

Я использую SHA1CryptoServiceProvider:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 

Для тестирования я создал новый проект Visual Studio с 2-мя консольными приложениями.
Первый адрес для платформы .NET Framework 3.5 и второй версии 4.0.
Я использовал точно такой же код хэширования в обоих случаях, и были созданы разные результаты.

Почему это происходит и как я могу это исправить?
Я, очевидно, не могу обновить все мои пароли пользователей, учитывая, что я не знаю, что это такое.

Любая помощь была бы принята с благодарностью.

КОД ОБРАЗЦА

public static class SHA1Hash 
{ 

    public static string Hash(string stringToHash) 
    { 
     return (Hash(stringToHash, Encoding.Default)); 
    } 

    public static string Hash(string stringToHash, Encoding enc) 
    { 
     byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse()); 
     var cryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 
     string hash = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)); 
     return hash; 
    } 
} 
+0

возможно дубликат [Войти сбой после обновления до ASP.net 4.0 от 3.5] (http://stackoverflow.com/questions/2739196/login -fails-after-upgrade-to-asp-net-4-0-from-3-5) - решение включено –

+0

, к сожалению, это не тот же случай. Это касается FormsAuthenticationCookies и ViewState и является лишь проблемой «если вы запускаете смешанный ASP.NET 2.0/ASP.NET 4». Но DANG Я думал, что это мое решение – WebDude

+0

Можете ли вы устранить путаницу AsymetricHash/Hash? Просто быть в безопасности. –

ответ

2

Один из комментариев привел меня на найти ошибку в моем коде.
При создании массива байтов, который должен быть хэширован, я пытался добавить строку с измененной версией самой.

E.g. дал «пароль» хэш Я бы на самом деле хэш «passworddrowssap»

Однако мой код имеет небольшую ошибку в нем:

.Reverse() представляет собой метод расширения Linq, который может изменить строку.
Однако он не возвращает строку, он возвращает:

IEnumerable<Char> 

Вызов .ToString() на этом типе фактически возвращает:

System.Linq.Enumerable + d__99`1 [System. Char]

Делать то же самое в .NET 4.0 возвращает

S ystem.Linq.Enumerable + d__a0`1 [System.Char]

Следовательно, мои пароли хэшировали по-разному.
Что я должен сделать, чтобы создать с помощью массива байт был:

byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray())); 
0

Похоже, это может быть проблема кодировки символов. Убедитесь в том, что строка, в которой хэшируются в кодировке [utf8, и т.д. ANSI] вы ожидаете (и если да, то убедитесь, что старая среда тоже.)

-Oisin

+0

Я использую Encoding.Default. Я попытался указать кодировку, и ни одно из следующих не было выполнено: Encoding.ASCII, Encoding.BigEndianUnicode, Encoding.Unicode, Encoding.UTF32, Encoding.UTF7, Encoding.UTF8 – WebDude

+0

хеширование работает на уровне байтового потока - я не уверен, понимаете ли вы меня. Где вы указываете кодировку? Все, что имеет значение, состоит в том, что обе системы проверены на то, чтобы они загружали одни и те же _bytes_ в класс sha1. – x0n

+0

, пожалуйста, посмотрите пример кода, который я вызываю. Оба сайта работают на одном сервере, поэтому я не уверен, где будет изменяться кодировка. Как я могу проверить, что обе системы загружают одни и те же байты в класс sha1? как мой пример кода выше, могу ли я просто проверить buffer.Length? – WebDude

Смежные вопросы