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

时间:2011-02-17 16:16:53

标签: php sha1 as3crypto

在as3中使用as3crypto从字符串'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

4 个答案:

答案 0 :(得分:2)

十六进制(你用Hex.toArray转换)值12345与字符串“12345”不同。

您正在将十进制数字转换为十六进制字节数组并对其进行哈希处理,然后将其与生成的哈希字符串进行比较用PHP。这些永远不会匹配。

如果您绝对需要将两个十六进制数字进行比较,那么对此类PHP的更改可能会起作用。

  

打印“SHA:”。 SHA1(dechex(12345));

See the dechex PHP documentation for more.

答案 1 :(得分:2)

使用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 );

答案 2 :(得分:1)

PHP输出绝对正确。我根据MySQL的sha1函数测试了它:

mysql> select sha1('12345');
+------------------------------------------+
| sha1('12345')                            |
+------------------------------------------+
| 8cb2237d0679ca88db6464eac60da96345513964 |
+------------------------------------------+

可能的罪魁祸首就是 - 您在此行的输入数据上使用Hex.toArray()

var src:ByteArray = Hex.toArray("12345");

当您需要将原始字符串放在字节数组中时。我不知道AS3,所以无法回答为什么你的第二次尝试也失败了。

答案 3 :(得分:1)

var sha1:SHA1 = new SHA1(); 
var src:ByteArray = new ByteArray(); 
src.writeUTFBytes("12345"); 
trace( Hex.fromArray( sha1.hash( src ) ) );

使用writeUTFBytes,此方法将字符串写入bytesarray对象而不使用BOM。