来自as3crypto的sha1哈希值与用PHP创建的哈希值不同

使用as3crypto在as3中使用字符串'12345'进行SHA1哈希,就像在示例中完成它一样:
var sha1:SHA1 = new SHA1;
var src:ByteArray = Hex.toArray("12345");
var digest:ByteArray = sha1.hash(src);
trace('SHA:' + Hex.fromArray(digest));
结果:ec60c0fd70d82a7785f6c9a02dbe16f2e40b1344 在PHP中使用相同的字符串创建SHA1:
print "SHA:".sha1("12345");
结果:8cb2237d0679ca88db6464eac60da96345513964 如果我尝试其他工具来获取哈希,我得到第二个结果,所以看起来PHP的结果是正确的。 问题:如何使用as3crypto获取相同的哈希值? BTW:在测试时我发现as3crypto的另一种方式给了我另一个(错误的?)结果:
var src:ByteArray = new ByteArray();
src.writeUTF("12345");
var digest:ByteArray = sha1.hash(src);
trace('SHA:' + Hex.fromArray(digest));
结果:b98cfbc53daec4029895585ab198f7403d0d0506     
已邀请:
十六进制(您使用Hex.toArray转换它)值12345与字符串“12345”不同。 您正在将十进制数转换为十六进制字节数组并对其进行散列,然后将其与PHP中生成的字符串的散列进行比较。这些永远不会匹配。 如果你绝对需要将两个十六进制数比较在一起,那么像这样改变你的PHP应该可行。   打印“SHA:”。 SHA1(dechex(12345)); 有关更多信息,请参阅dechex PHP文档。     
使用as3crypto lib匹配php sha1的正确方法是执行以下操作:
var src:ByteArray = Hex.toArray(Hex.fromString(srcString));
var sha1:SHA1 = new SHA1();
var hashedString:String = Hex.fromArray(sha1.hash( src ));
第一个额外的Hex.fromString避免了其他人提到的十进制转换。 注意:as3corelib版本更简单:as3corelib SHA1
var hashedString:String = SHA1.hash( srcString );
    
PHP输出肯定是正确的。我针对MySQL的
sha1
函数测试了它:
mysql> select sha1('12345');
+------------------------------------------+
| sha1('12345')                            |
+------------------------------------------+
| 8cb2237d0679ca88db6464eac60da96345513964 |
+------------------------------------------+
可能的罪魁祸首是 - 你在这一行的输入数据上使用
Hex.toArray()
var src:ByteArray = Hex.toArray("12345");
当您需要将原始字符串放在字节数组中时。我不知道AS3,所以不能回答为什么你的第二次尝试也失败了。     
var sha1:SHA1 = new SHA1(); 
var src:ByteArray = new ByteArray(); 
src.writeUTFBytes("12345"); 
trace( Hex.fromArray( sha1.hash( src ) ) );
使用
writeUTFBytes
,此方法将字符串写入bytesarray对象而不使用BOM。     

要回复问题请先登录注册