我正在尝试在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
是必不可少的。
希望这可以帮助某人。
谢谢, 标记
答案 0 :(得分:5)
echo -n
var passwordHashHex = String.Concat(Array.ConvertAll(passwordHash , x => x.ToString("X2"));
要转换为十六进制
答案 1 :(得分:0)
根据手册:
总和的计算方法如下所述 FIPS PUB 180-2。 检查时, 输入应该是以前的输出 这个程序。默认模式是 用校验和打印一行,a 字符表示类型('*'表示 二进制,'?'便携式,''为 文本),以及每个文件的名称。
可能(我不知道)生成盐渍哈希。它的长度不仅仅与哈希值一致。
您是否尝试过使用“ sha1sum ”?我得到有关此信息的相互矛盾的信息,但它可能会有效。