当某个十六进制是字符串的一部分(即“abc\xBF\x4E”)时,ActionScript 中字符串的 MD5 返回不正确的结果
我正在尝试使用 Adobe 创建的 MD5 算法对 ActionScript 中的字符串进行 MD5,该算法是 AS3corelib 的一部分。 (http://as3corelib.googlecode.com/svn /trunk/src/com/adobe/crypto/MD5.as)。
我将其与在 php 中创建的 MD5 进行比较,我知道它是正确的。
如果我使用 AS 和 PHP 创建 MD5,例如像“abcd1234”这样的字符串,那么它们都是相等的,正如预期的那样。问题是,当我的字符串中包含一些十六进制即“abcd\x28\xBF\x4E”时,ActionSCript 和 php 的 MD5 返回不同的值。
现在真正奇怪的部分是,只要十六进制是数字形式,当它是字符串时,它就很好并且仍然匹配:
即
“abcd\x28\x46”将具有来自 AS 的 MD5 和 php 的 MD5 的匹配值。 尽管 “abcd\x28\xBF”将产生不同的哈希值。
有人有什么想法吗?我已经彻底测试了 php MD5,我知道它是正确的,而 ActionScript 是不正确的。感谢您的帮助,感谢您的阅读,如果这令人困惑,我深表歉意。当涉及到字符串编码、表示等方面时,我是一个菜鸟。 谢谢, 德鲁·S。
I am trying to MD5 a string in ActionScript using the MD5 algorithm that was created by Adobe and is part of AS3corelib. (http://as3corelib.googlecode.com/svn/trunk/src/com/adobe/crypto/MD5.as).
I am comparing this to an MD5 created in php that I know is correct.
If I create MD5s using AS and PHP for say a string like "abcd1234" they both are equal, as is to be expected. The problem is, when my string contains some hexadecimal in it ie "abcd\x28\xBF\x4E", the MD5s from ActionSCript and php return different value.
Now the really strange part is as long as the hexadecimal is in the form of a number when its a string its fine and still matches:
ie
"abcd\x28\x46" will have matching values from AS's MD5 and php's MD5.
While
"abcd\x28\xBF" will yield different hashes.
Anyone have any ideas? I've tested the php MD5 thoroughly and I know it is correct and the ActionScript is incorrect. I appreciate the help, thanks for reading and I apologize if this was confusing. I'm a noob when it comes to string encoding, representation etc.
Thanks,
Drew S.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最有可能的是,PHP 和 ActionScript 对字符串使用不同的编码;一个可能使用 ISO-8859-1,另一个使用 UTF-8。
对于
abcd\x28\xBF
,值为:fcfebaeb81afe401c4b608dc684ad08f
47ef883a009ddbe01711ece0a0a8764e
UTF-8 下的值以及
abcd \x28\xBF\x4E
(您的另一个示例),值为:ea382d63efca32d8d7861a314a6112e3
dc11cdbaa05aa41640a821fb8e290eae
UTF-8 下Most likely, PHP and ActionScript are using different encodings for strings; one is probably using ISO-8859-1 and the other is using UTF-8.
For
abcd\x28\xBF
, the values are:fcfebaeb81afe401c4b608dc684ad08f
under ISO-8859-147ef883a009ddbe01711ece0a0a8764e
under UTF-8And for
abcd\x28\xBF\x4E
(your other example), the values are:ea382d63efca32d8d7861a314a6112e3
under ISO-8859-1dc11cdbaa05aa41640a821fb8e290eae
under UTF-8您的第二个问题是由于字符串通常被定义为 NUL(或零)终止缓冲区。
不过,有一个解决方法。 iso-8859-1 定义了 256 个可能的字符(包括 NUL 字符)。 UTF 中的前 256 个代码点与 iso-8859-1 中的相同(如果您使用 UTF-8、UTF-16 等,编码可能会有所不同,但无论您如何编码这些代码点,代码点都是相同的)。
因此,如果您知道字符串中的所有代码点都在 0-255 范围内(因为它是 latin1)并且您知道可以嵌入 NUL,则可以手动迭代字符串,获取每个字符的代码点并将其作为一个字节存储在缓冲区中。像这样的事情:
Your second problem is due to strings being commonly defined as NUL (or zero) terminated buffers.
There's a workaround, though. iso-8859-1 defines 256 possible characters (including the NUL char). The first 256 code points in UTF are the same as in iso-8859-1 (the encoding may differ if you use UTF-8, UTF-16, etc, but the codepoints are the same regarless how you enconde those codepoints).
So, if you know that all of the codepoints in your string will be in the range 0-255 (since it's latin1) and you know it's ok to have embedded NULs, you can manually iterate over your string, get the codepoint of each char and store it as a byte in your buffer. Something like this: