如果.net sha1 hash需要一个字节数组,并且php sha1()想要一个字符串,我可以匹配结果吗?

时间:2009-03-05 18:51:18

标签: .net php sha1

我有一组字节我想要应用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的东西是固定的,无法修改。谢谢!

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

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

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

请注意,您可以在.NET中使用相同的格式轻松创建此字符串(在每个字节上调用ToString时使用“x2”格式并将它们全部附加在一起)。

答案 2 :(得分: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;