HOY*_*HOY 7 md5 amazon-web-services cryptojs
使用CryptoJS我正在计算这篇文章底部字符串的MD5,并将其发送到亚马逊网络服务,但是我计算的MD5值与亚马逊计算的不同。
所以我做了一些在线测试,发现在某些 md5 计算网站上,MD5 计算也有所不同。比如md5hashgenerator和我计算相同的值,onlinemd5和amazon计算相同的值。
我需要的是使用 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 与亚马逊实现相同的结果?
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 的工具)。
一种猜测是,这与其他提供商在散列之前对有效负载(在本例中为字符串化 XML)加盐有关。我没有看到太多文档,因为它们都是小型免费在线工具。明确这一点是有好处的,因为它可能会导致这样的情况:即使有效负载相同,您也无法确认您这边使用不同盐值计算的哈希值。
CryptoJS似乎没有将加盐作为一项显式功能来实现。
| 归档时间: |
|
| 查看次数: |
1224 次 |
| 最近记录: |