Можно ли преобразовать 40-символьный хэш SHA1 в 20-символьный хэш SHA1? - PullRequest
3 голосов
/ 18 марта 2010

Моя проблема немного волосатая, и я могу задавать неправильные вопросы, поэтому, пожалуйста, потерпите меня ...

У меня есть устаревшая база данных MySQL, в которой хранятся пользовательские пароли и соли для системы членства. Оба эти значения были хэшированы с использованием среды Ruby - примерно так:

hashedsalt = Digest :: SHA1.hexdigest ( "- # {Time.now.to_s} - {#} Логин -")

hashedpassword = Digest :: SHA1.hexdigest ( "# {hashedsalt}: # {пароль}")

Таким образом, оба значения хранятся в виде 40-символьных строк (varchar (40)) в MySQL.

Теперь мне нужно импортировать всех этих пользователей в структуру членства ASP.NET для нового веб-сайта, который использует базу данных SQL Server. Насколько я понимаю, при настройке членства в ASP.NET пароли и соли пользователей также хранятся в базе данных членства (в таблице aspnet_Membership) в виде хэшей SHA1, которые затем кодируются в Base64 (см. здесь для подробной информации) и хранится в виде данных nvarchar (128).

Но из длины хранимых строк в кодировке Base64 (28 символов) кажется, что хэши SHA1, которые генерирует членство ASP.NET, имеют длину всего 20 символов, а не 40. Из какого-то другого чтения, которое я делал, я Я думаю, что это связано с количеством битов на символ / набор символов / кодировки или что-то связанное.

Так есть ли какой-нибудь способ преобразования 40-символьных хэшей SHA1 в 20-символьные, которые я затем могу перенести в новую таблицу данных о членстве в ASP.NET? Я довольно хорошо знаком с членством в ASP.NET, но мне кажется, что я просто пропускаю этот кусок. Однако также может быть известно, что SHA1 в Ruby и SHA1 в .NET несовместимы, поэтому я сражаюсь в проигрышной битве ...

Заранее благодарим за понимание.

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

Представление varchar в вашем приложении на Ruby выглядит как «hex as string», что-то вроде этого: 01AB02EF...23EF. то есть каждый байт представлен в виде пары символов, представляющих собой шестнадцатеричное значение байта, от 00 до FF. Поэтому хэш SHA (20 байтов) представлен в виде 40 символов. Если хэш - это значения (0, 1, 2, ...), строка будет 000102. ASP base64 - это кодировка base64 фактических байтов. Поэтому все, что вам нужно сделать, это взять символы MySQL и получить соответствующие байты, а затем кодировать их как base64.

На самом деле вы можете выполнить преобразование в самом SQL:

declare @x varchar(40);
set @x = '000102030405060708090A0B0C0D0E0F10111213';

declare @sql nvarchar(max);
set @sql = N'set @out=0x' + @x;

declare @out varbinary(20);
exec sp_executesql @sql, N'@out varbinary(20) output', @out output;
select @out for xml path('');

Но чтобы заставить вашего поставщика членства ASP.Net использовать соленый хеш, созданный вашим Ruby-кодом, независимо от кодировки, используемой для хранения хеш-дайджеста, это совсем другая тема. Скорее всего, вам придется переписать свой собственный поставщик членства, после чего кодировка хранилища теряет свою актуальность, поскольку вы можете хранить их по своему желанию.

1 голос
/ 18 марта 2010

Ruby использует SHA2, а ASP.NET использует SHA1, и нет, вы не можете «конвертировать» между этими версиями.Для этого вам необходимо пересчитать хэши из открытого текста.

Редактировать: SHA стандартизирован, поэтому вы можете искать в Интернете библиотеку SHA2 для использования в ASP.NET.

...