.NET中的SHA1CryptoServiceProvider与UNIX shasum不匹配

Mar*_*man 1 c# encryption cryptography sha1

我正在尝试在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哈希是存储在db中的内容.

如果我在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算法有什么不同?我也不腌这些.

UPDATE

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

echo -n剥离换行符,-binary是必不可少的.

希望这可以帮助别人.

谢谢,马克

nos*_*nos 5

  • echo需要添加换行符 echo -n
  • shasum可能会这样做,在将它输送到base64之前检查输出
  • sha1.ComputeHash()为您提供了返回二进制哈希表示,而不是shasum实用程序生成的十六进制表示 - 这意味着您在C#中使用base64编码与unix命令行不同的东西.var passwordHashHex = String.Concat(Array.ConvertAll(passwordHash , x => x.ToString("X2"));在C#中执行base64转换之前,请使用eg 转换为十六进制