如果.net sha1哈希需要一个字节数组,而php sha1()需要一个字符串,我可以匹配结果吗?

如果.net sha1哈希需要一个字节数组,而php sha1()需要一个字符串,我可以匹配结果吗?,.net,php,sha1,.net,Php,Sha1,我有一组要应用sha1哈希的字节。一个散列在.net中,另一个在PHP中。然后我会测试他们是否匹配 在.net中,可以创建字节数组并使用sha.ComputeHash() 在PHP中,调用sha1($string) 对于代码的.net方面我无能为力,但是如何从PHP中获得与.net生成的相同的哈希值呢 请注意:我只能在PHP方面工作。net内容是固定的,无法修改。谢谢 看起来sha1函数采用十六进制表示法的字节数组。因此,如果有两个字节,FA和A1,字符串将是“FAA1” 然后,将结果字符串解析

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

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

在PHP中,调用sha1($string)

对于代码的.net方面我无能为力,但是如何从PHP中获得与.net生成的相同的哈希值呢


请注意:我只能在PHP方面工作。net内容是固定的,无法修改。谢谢

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

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


请注意,您可以在.NET中使用相同的格式创建此字符串(在调用ToString时使用“x2”格式,将每个字节都添加到一起)。

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

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

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

这对我很有用:

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;
string str=user.Salt+pepper+password;
SHA1 SHA1=新的SHA1密码服务提供者();
ascienceoding编码器=新的ascienceoding();
字节[]输入=编码器.GetBytes(str);
字节[]散列=sha1.ComputeHash(输入);
字符串hashStr=“”;
for(int i=0;i
再一次,非常好的建议。我会让我的.net助手给我发送一个发送到ComputeHash函数的数据示例,看看我是否可以将PHP转换为它。你再次接受了我的答案。你找到问题所在了吗?我终于找到了。net端正在创建一个键控哈希,因此我需要使用hash_hmac()和一个验证键。
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;