当某个十六进制是字符串的一部分(即“abc\xBF\x4E”)时,ActionScript 中字符串的 MD5 返回不正确的结果

发布于 2024-08-20 16:24:32 字数 723 浏览 2 评论 0原文

我正在尝试使用 Adob​​e 创建的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

转角预定愛 2024-08-27 16:24:32

最有可能的是,PHP 和 ActionScript 对字符串使用不同的编码;一个可能使用 ISO-8859-1,另一个使用 UTF-8。

对于 abcd\x28\xBF,值为:

  • ISO-8859-1 下的 fcfebaeb81afe401c4b608dc684ad08f
  • 47ef883a009ddbe01711ece0a0a8764e UTF-8 下的值

以及 abcd \x28\xBF\x4E (您的另一个示例),值为:

  • ISO-8859-1 下的 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-1
  • 47ef883a009ddbe01711ece0a0a8764e under UTF-8

And for abcd\x28\xBF\x4E (your other example), the values are:

  • ea382d63efca32d8d7861a314a6112e3 under ISO-8859-1
  • dc11cdbaa05aa41640a821fb8e290eae under UTF-8
惟欲睡 2024-08-27 16:24:32

您的第二个问题是由于字符串通常被定义为 NUL(或零)终止缓冲区。

不过,有一个解决方法。 iso-8859-1 定义了 256 个可能的字符(包括 NUL 字符)。 UTF 中的前 256 个代码点与 iso-8859-1 中的相同(如果您使用 UTF-8、UTF-16 等,编码可能会有所不同,但无论您如何编码这些代码点,代码点都是相同的)。

因此,如果您知道字符串中的所有代码点都在 0-255 范围内(因为它是 latin1)并且您知道可以嵌入 NUL,则可以手动迭代字符串,获取每个字符的代码点并将其作为一个字节存储在缓冲区中。像这样的事情:

var s:String = "abc\x00d\x28\xBF";
var buffer:ByteArray = new ByteArray();
var len:int = s.length;
for(var i:int = 0; i < len; i++) {
    buffer.writeByte(s.charCodeAt(i));
}

//  trace it
buffer.position = 0;
while(buffer.bytesAvailable) {
    trace("0x" + buffer.readUnsignedByte().toString(16));
}

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:

var s:String = "abc\x00d\x28\xBF";
var buffer:ByteArray = new ByteArray();
var len:int = s.length;
for(var i:int = 0; i < len; i++) {
    buffer.writeByte(s.charCodeAt(i));
}

//  trace it
buffer.position = 0;
while(buffer.bytesAvailable) {
    trace("0x" + buffer.readUnsignedByte().toString(16));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文