2

我有一组要应用 sha1 哈希的字节。一个散列在 .net 中,另一个在 PHP 中。然后我会测试它们是否匹配。

在 .net 中,您可以创建一个字节数组并使用 sha.ComputeHash()。

byte[] data = new byte[DATA_SIZE];
byte[] result; 

SHA1 sha = new SHA1CryptoServiceProvider(); 
// This is one implementation of the abstract class SHA1.
result = sha.ComputeHash(data);

在 PHP 中,您调用 sha1($string)。

我无法对代码的 .net 端做任何事情,但是如何从 PHP 中获得与 .net 生成的相同的哈希值?

请注意:我只能在 PHP 方面工作。.net 的东西是固定的,不能修改。谢谢!

4

3 回答 3

5

由于 SHA1 是一种通用的标准算法,因此它在 PHP 中的实现方式与在 .NET 中的实现方式相同。唯一不同的部分是调用这两个函数的方式。

从技术上讲,SHA1 是在字节而不是字符串上定义的,但是(如果我错了,请纠正我)PHP 字符串适用于单字节字符,因此从 SHA1 算法的角度来看,字节和字符应该是可互换的。

您必须确保二进制字符串的值与 .NET 的字节数组相同,顺序相同。我不是 PHP 人,所以你必须得到别人的答案才能做到这一点。

于 2009-03-05T18:58:41.677 回答
1

看起来 sha1 函数采用十六进制表示法的字节数组。所以如果你有两个字节,FA 和 A1,你的字符串就是“FAA1”。

然后,您会将结果字符串解析回字节并与 .NET 输出进行比较。

请注意,您可以很容易地在 .NET 中以相同格式创建此字符串(在每个字节上调用 ToString 时使用“x2”格式并将所有内容附加在一起)。

于 2009-03-05T18:57:17.483 回答
0

这对我有用:

string str = user.Salt + pepper + password;
SHA1 sha1 = new SHA1CryptoServiceProvider();
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] input = encoder.GetBytes(str);
byte[] hash = sha1.ComputeHash(input);
string hashStr = "";
for (int i = 0; i < hash.Length; i++)
     hashStr += hash[i].ToString("X").ToLower();
if (hashStr != user.Hash)
     return false;
于 2009-11-24T16:10:01.793 回答