我的问题有点毛茸茸,我可能会问错误的问题,所以请耐心等待......
我有一个遗留的MySQL数据库,用于存储用户密码和会员制的盐。这两个值都使用Ruby框架进行了散列 - 大致如下:
hashedsalt = 文摘:: SHA1.hexdigest( “ - #{Time.now.to_s} - #{登录} - ”)
hashedpassword = 文摘:: SHA1.hexdigest( “#{hashedsalt}:#{密码}”)
因此,两个值都存储为MySQL中的40个字符的字符串(varchar(40))。
现在,我需要将所有这些用户导入到ASP.NET成员资格框架中,以用于使用SQL Server数据库的新网站。我的理解是,我配置ASP.NET成员资格的方式,用户密码和salt也作为SHA1哈希值存储在成员资格数据库(表aspnet_Membership中)中,然后进行Base64编码(参见here for细节)并存储为nvarchar(128)数据。
但是从存储的Base64编码字符串的长度(28个字符)开始,ASP.NET成员资格生成的SHA1哈希似乎只有20个字符,而不是40个。从其他一些读数我一直在做我认为这与每个字符/字符集/编码或相关内容的位数有关。
那么有没有办法将40个字符的SHA1哈希值转换为20个字符的哈希值,然后我可以将其转移到新的ASP.NET成员资格数据表中?我现在对ASP.NET成员非常熟悉,但我觉得我只是错过了这一件。但是,也可能知道Ruby中的SHA1和.NET中的SHA1是不兼容的,所以我正在打一场失败的战斗......
提前感谢任何见解。
答案 0 :(得分:2)
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代码创建的盐渍哈希,与用于存储哈希摘要的编码无关,这是一个完全不同的主题。您可能需要重写自己的成员资格提供程序,此时存储编码变得无关紧要,因为您可以根据需要存储它们。
答案 1 :(得分:1)
Ruby使用SHA2,而ASP.NET使用SHA1,不,你不能在这些版本之间“转换”。为此,您需要重新计算明文中的哈希值。
编辑:SHA是标准化的,因此您可以在互联网上搜索要在ASP.NET中使用的SHA2库。