在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
答案 0 :(得分:2)
十六进制(你用Hex.toArray转换)值12345与字符串“12345”不同。
您正在将十进制数字转换为十六进制字节数组并对其进行哈希处理,然后将其与生成的哈希字符串进行比较用PHP。这些永远不会匹配。
如果您绝对需要将两个十六进制数字进行比较,那么对此类PHP的更改可能会起作用。
打印“SHA:”。 SHA1(dechex(12345));
答案 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。