asp.net-是否可以将40个字符的SHA1哈希转换为20个字符的SHA1哈希?

我的问题有点毛躁,可能是我问错了问题,所以请多包涵…

我有一个旧的MySQL数据库,该数据库存储用户密码&成员系统的盐.这两个值都已使用Ruby框架进行了哈希处理-大致如下所示:

hashedsalt =
Digest::SHA1.hexdigest(“–#{Time.now.to_s}–#{login}–“)

hashedpassword =
Digest::SHA1.hexdigest(“#{hashedsalt}:#{password}”)

因此,两个值在MySQL中都存储为40个字符的字符串(varchar(40)).

现在,我需要将所有这些用户导入到新网站的ASP.NET成员资格框架中,该网站使用SQL Server数据库.据我了解,以我配置ASP.NET成员身份的方式,用户密码和盐也作为SHA1哈希存储在成员身份数据库(在表aspnet_Membership中)中,然后进行Base64编码(有关详细信息,请参见here)并存储作为nvarchar(128)数据.

但是从存储的Base64编码字符串的长度(28个字符)来看,ASP.NET成员身份生成的SHA1散列似乎只有20个字符长,而不是40个字符.从其他方面的研究中,我一直在思考与每个字符/字符集/编码或相关内容的位数有关.

那么,是否有某种方法可以将40个字符的SHA1哈希转换为20个字符的哈希,然后可以将其转移到新的ASP.NET成员资格数据表中?到目前为止,我对ASP.NET成员身份非常熟悉,但是我感觉我只是想念这一部分.但是,也可能知道Ruby中的SHA1和.NET中的SHA1是不兼容的,所以我正在一场失败的战斗中…

预先感谢您的任何见解.

解决方法:

Ruby应用程序中的varchar表示形式似乎是“字符串形式的十六进制”,类似于: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代码的盐腌哈希,与用于存储哈希摘要的编码无关,这是一个完全不同的主题.您可能必须重写自己的成员资格提供程序,这时存储编码变得无关紧要,因为您可以根据需要存储它们.

上一篇:ruby mvc运行原理


下一篇:28_在项目中重新搭建一套读写分离+高可用+多master的redis cluster集群