相同字符串的不同 MD5 哈希值 (CryptoJS.MD5)

HOY*_*HOY 7 md5 amazon-web-services cryptojs

使用CryptoJS我正在计算这篇文章底部字符串的MD5,并将其发送到亚马逊网络服务,但是我计算的MD5值与亚马逊计算的不同。

所以我做了一些在线测试,发现在某些 md5 计算网站上,MD5 计算也有所不同。比如md5hashgenerator和我计算相同的值,onlinemd5amazon计算相同的值。

我需要的是使用 CryptoJS 获得与亚马逊相同的 MD5 值

- CryptoJS.MD5: ec20007986ee9e1a5152c35d07e87fcc

- 亚马逊 Scratchpad MD5: ee288aa4858481d7b1d7422c6fc4b3af

- md5hashgenerator.com: ec20007986ee9e1a5152c35d07e87fcc

- onlinemd5.com:ee288aa4858481d7b1d7422c6fc4b3af


用于计算 MD5 的字符串:

<?xml version="1.0" encoding="iso-8859-1"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
  <Header>
    <DocumentVersion>1.01</DocumentVersion>
    <MerchantIdentifier>M_EXAMPLE_123456</MerchantIdentifier>
  </Header>
  <MessageType>Product</MessageType>
  <PurgeAndReplace>false</PurgeAndReplace>
  <Message>
    <MessageID>1</MessageID>
    <OperationType>Update</OperationType>
    <Product>
      <SKU>56789</SKU>
      <StandardProductID>
        <Type>ASIN</Type>
        <Value>B0EXAMPLEG</Value>
      </StandardProductID>
      <ProductTaxCode>A_GEN_NOTAX</ProductTaxCode>
      <DescriptionData>
        <Title>Example Product Title</Title>
        <Brand>Example Product Brand</Brand>
        <Description>This is an example product description.</Description>
        <BulletPoint>Example Bullet Point 1</BulletPoint>
        <BulletPoint>Example Bullet Point 2</BulletPoint>
        <MSRP currency="USD">25.19</MSRP>
        <Manufacturer>Example Product Manufacturer</Manufacturer>
        <ItemType>example-item-type</ItemType>
      </DescriptionData>
      <ProductData>
        <Health>
          <ProductType>
            <HealthMisc>
              <Ingredients>Example Ingredients</Ingredients>
              <Directions>Example Directions</Directions>
            </HealthMisc>
          </ProductType>
        </Health>
      </ProductData>
    </Product>
  </Message>
</AmazonEnvelope>
Run Code Online (Sandbox Code Playgroud)

编辑:经过一些测试,我意识到差异是由于“换行符”字符引起的。所以问题是为什么在这些工具中换行符的处理方式不同,我如何使用 CryptoJS 与亚马逊实现相同的结果?

Eti*_*ret 5

md5(以及其他散列函数,如 sha*、Murmur...)处理二进制数据。因此,您如何将文本转换为二进制会改变生成的哈希值。显然,相同的文本在 UTF-8、UTF-16 或 UTF-32 中会有不同的哈希值。

换行的情况有点棘手。在古代,人们必须在打字机上按两次键才能换行:回车,将打印头放回行首,同时保持相同的垂直位置,换行,将打印头向下移动一个线,同时保持在同一水平位置。

在早期的计算机时代,人们模仿了这一点,US-ASCII 有两个关于行终止的代码点:CR (0x0D) 和 LF (0x0A)。用著名的 CRLF 序列制作了一个换行符。例如,HTTP/1.0 标准要求 CRLF 作为标头之间的分隔符(我没有检查 HTTP/1.1 和 HTTP/2)。

然后人们开始认为一个概念的两个字符是一种浪费,Unix 系统开始只使用 LF,而 Mac 系统(在 OS X 之前)只使用 CR(而 Windows,好吧,认为你有足够的内存来存储所有这些多余的字节)。

因此,我将您的文本存储在我的 Ubuntu 计算机上一个名为“tmp”的文件中,使用 LF 作为行分隔符,并且:

$ md5sum tmp 
ee288aa4858481d7b1d7422c6fc4b3af  tmp
$ unix2dos tmp 
unix2dos: converting file tmp to DOS format...
$ md5sum tmp 
ec20007986ee9e1a5152c35d07e87fcc  tmp
Run Code Online (Sandbox Code Playgroud)

瞧!!

(unix2dos 是一个将 LF 转换为 CRLF 的工具)。


zar*_*vic 0

一种猜测是,这与其他提供商在散列之前对有效负载(在本例中为字符串化 XML)加盐有关。我没有看到太多文档,因为它们都是小型免费在线工具。明确这一点是有好处的,因为它可能会导致这样的情况:即使有效负载相同,您也无法确认您这边使用不同盐值计算的哈希值。

CryptoJS似乎没有将加盐作为一项显式功能来实现。