gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:22:51 25 4
gpt4 key购买 nike

我的问题有点毛病,可能问错了问题,还请多多包涵...

我有一个遗留的 MySQL 数据库,用于存储成员(member)系统的用户密码和盐。这两个值都已使用 Ruby 框架进行了哈希处理 - 大致如下:

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

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

所以这两个值在 MySQL 中都存储为 40 个字符的字符串 (varchar(40))。

现在我需要将所有这些用户导入到一个使用 SQL Server 数据库的新网站的 ASP.NET 成员资格框架中。据我了解,我配置 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 代码创建的加盐哈希,与用于存储哈希摘要的编码无关,那是一个完全不同的话题。您可能必须重写自己的成员资格提供程序,此时存储编码变得无关紧要,因为您可以按照自己的意愿存储它们。

关于asp.net - 是否可以将 40 个字符的 SHA1 哈希转换为 20 个字符的 SHA1 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com