2

使用 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 获得相同的哈希?

顺便说一句:在测试时,我发现使用 as3crypto 的另一种方法给了我另一个(错误的?)结果:

var src:ByteArray = new ByteArray();
src.writeUTF("12345");
var digest:ByteArray = sha1.hash(src);
trace('SHA:' + Hex.fromArray(digest));

结果:b98cfbc53daec4029895585ab198f7403d0d0506

4

4 回答 4

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 );
于 2012-04-14T23:18:47.660 回答
2

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

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

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

打印 "SHA:" 。sha1(十进制(12345));

有关更多信息,请参阅 dechex PHP 文档。

于 2011-02-17T16:38:37.757 回答
1

The PHP output is definitely correct. I tested it against MySQL's sha1 function:

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

The likely culprit is this - you're using Hex.toArray() on the input data in this line:

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

When you need the original string to be in the byte array. I don't know AS3, though, so can't answer why your second attempt also failed.

于 2011-02-17T16:25:27.743 回答
1
var sha1:SHA1 = new SHA1(); 
var src:ByteArray = new ByteArray(); 
src.writeUTFBytes("12345"); 
trace( Hex.fromArray( sha1.hash( src ) ) );

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

于 2016-08-04T05:08:03.770 回答