.NET中的SHA1CryptoServiceProvider与UNIX shasum不匹配

时间:2010-07-13 20:49:36

标签: 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算法有何不同?我也不腌这些。

更新

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

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

希望这可以帮助某人。

谢谢, 标记

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

根据手册:

  

总和的计算方法如下所述   FIPS PUB 180-2。 检查时,   输入应该是以前的输出   这个程序。默认模式是   用校验和打印一行,a   字符表示类型('*'表示   二进制,'?'便携式,''为   文本),以及每个文件的名称。

可能(我不知道)生成盐渍哈希。它的长度不仅仅与哈希值一致。

您是否尝试过使用“ sha1sum ”?我得到有关此信息的相互矛盾的信息,但它可能会有效。