Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自as3crypto的sha1散列与使用PHP生成的散列不同_Php_Sha1_As3crypto - Fatal编程技术网

来自as3crypto的sha1散列与使用PHP生成的散列不同

来自as3crypto的sha1散列与使用PHP生成的散列不同,php,sha1,as3crypto,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中使用相同的字符串

使用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");
结果:8CB2237D0679CA88DB64EAC60DA96345513964

如果我尝试其他工具来获取散列,我会得到第二个结果,因此看起来PHP的结果是正确的

问题:如何使用as3crypto获得相同的哈希值?

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


结果:b98cfbc53daec4029895585ab198f7403d00d0506

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

mysql> select sha1('12345');
+------------------------------------------+
| sha1('12345')                            |
+------------------------------------------+
| 8cb2237d0679ca88db6464eac60da96345513964 |
+------------------------------------------+
可能的罪魁祸首是这样的-您在此行的输入数据上使用了
Hex.toArray()

var src:ByteArray = Hex.toArray("12345");
当您需要原始字符串位于字节数组中时。不过,我不知道AS3,因此无法回答第二次尝试也失败的原因。

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

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

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

打印“SHA:”。sha1(dechex(12345))


使用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版本更简单:


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

这可能是由于不同的字符编码。能否在AS3中传入一个简单的字符串<代码>变量src='12345'?我怀疑,不管这些ByteArray如何为哈希函数字符串化,它们都不再是“12345”。@MarcB-显然不是,根据消息来源,该函数只接受字节数组作为输入。不过,这是一个不同寻常的加密库——大多数都允许您不断“更新”输入流,然后获得最终摘要。这一个似乎需要整个输入首先被存储在内存中,然后一下子消化掉。多亏了A.R.Younce。它与src.writeUTFBytes(“12345”)一起工作;对,在第一个示例中,我使用Hex.toArray对其进行了转换。问题是,在第二个示例中(请参见下文),我没有使用此函数,但仍然有错误的哈希值。您是否正在检查writeUTF的输出以准确查看哈希值?我看到有人建议它在字符串前面加上长度前缀。请参阅:改为尝试writeUTFBytes()。谢谢您的帮助。现在它与src.writeUTFBytes(“12345”)一起工作;
var src:ByteArray = Hex.toArray(Hex.fromString(srcString));
var sha1:SHA1 = new SHA1();
var hashedString:String = Hex.fromArray(sha1.hash( src ));
var hashedString:String = SHA1.hash( srcString );
var sha1:SHA1 = new SHA1(); 
var src:ByteArray = new ByteArray(); 
src.writeUTFBytes("12345"); 
trace( Hex.fromArray( sha1.hash( src ) ) );