gpt4 book ai didi

c# - .NET 中的 SHA1CryptoServiceProvider 与 UNIX shasum 不匹配

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:09 26 4
gpt4 key购买 nike

我正在尝试在 ASP.NET 应用程序和另一个基于 UNIX 的应用程序之间共享身份验证,其中散列密码存储在数据库中。我需要确保两个平台上的哈希算法匹配。

这就是我在 C# 中进行哈希处理的方式:

var sha1 = new SHA1CryptoServiceProvider();var passwordBytes = Encoding.UTF8.GetBytes(password);var passwordHash = sha1.ComputeHash(passwordBytes);var base64 = Convert.ToBase64String(passwordHash);return base64;

如果我使用密码 p@ssw0rd,则哈希为 57B2AD99044D337197C0C39FD3823568FF81E48A,该哈希的 base64 为 V7KtmQRNM3GXwMOf04I1aP+B5Io=。 base64 哈希是存储在数据库中的内容。

如果我在 UNIX 上做同样的事情,我会得到一个完全不同的散列:

echo p@ssw0rd | iconv -f ISO-8859-1 -t UTF-8 | shasum -a 1 | base64 -e产生ZTU3NmQwNmUzMTAwNmRkNzFhNTFjZTg5ZjViMGI4NWM2NTMyNzg3OCAgLQo=

如果您尝试使用 OpenSSL,请使用此 echo "p@ssw0rd"| openssl dgst -sha1 | openssl enc -base64 你会得到相同的散列值。

导致计算不同哈希值的两种 SHA1 算法有何不同?我也没有给这些加盐。

更新

秘诀如下:echo -n "p@ssw0rd"| openssl dgst -sha1 -二进制 | openssl enc -base64

echo -n 去掉换行符,-binary 必不可少。

希望这可以帮助某人。

谢谢,标记

最佳答案

  • echo 添加一个换行符,你需要做 echo -n
  • shasum 可能会做同样的事情,在将其通过管道传输到 base64 之前检查它的输出)
  • sha1.ComputeHash() 返回二进制哈希表示,而不是 shasum 实用程序生成的十六进制表示 - 这意味着您在 C# 和 unix 命令行中使用 base64 编码不同的内容。使用例如var passwordHashHex = String.Concat(Array.ConvertAll(passwordHash , x => x.ToString("X2")); 在 C# 中进行 base64 转换之前转换为十六进制

关于c# - .NET 中的 SHA1CryptoServiceProvider 与 UNIX shasum 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3241414/

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