Hash 如何计算Amazon';http请求的MD5哈希

Hash 如何计算Amazon';http请求的MD5哈希,hash,coldfusion,amazon-web-services,coldfusion-9,Hash,Coldfusion,Amazon Web Services,Coldfusion 9,有人知道如何计算需要与Amazon的SubmitFeed API一起使用的MD5哈希吗?我使用的是ColdFusion,每次我计算我端的MD5哈希值时,它都与Amazon计算的值不匹配 Amazon回应此错误: ContentMD5DoesNotMatch the Content-MD5 HTTP header you passed for your feed (C7EF1CADB27497B46FCD6F69516F96E0) did not match the Content-MD5 we

有人知道如何计算需要与Amazon的SubmitFeed API一起使用的MD5哈希吗?我使用的是ColdFusion,每次我计算我端的MD5哈希值时,它都与Amazon计算的值不匹配

Amazon回应此错误:

ContentMD5DoesNotMatch

the Content-MD5 HTTP header you passed for your feed (C7EF1CADB27497B46FCD6F69516F96E0) did not match the Content-MD5 we calculated for your feed (x+8crbJ0l7RvzW9pUW+W4A==)
我正在使用ColdFusion用于哈希的内置函数(例如
hash(myStr)
)。是否缺少一个步骤?

我检查了,您只需要以base64编码发送MD5。它目前只是十六进制编码

恐怕我不知道ColdFusion的方法是什么,也许是这样:

以下是我为实现这一目标所做的工作:

<cfset getMD5 = ToBase64(binaryDecode(hash(xmlRequest),'hex'))>


和Amazons MD5哈希匹配

这会给你的欲望输出

public any function EncryptSignature(required string argValue,required string publicKey) hint="I create my own signature that I will matching later." {
    local.filters=StructNew();
    local.filters["F:publicKey"]=arguments.publicKey;
    var jMsg=JavaCast("string",arguments.argValue).getBytes("iso-8859-1");
    var thisSecretKey = getDAO().getSecretKey(local.filters).apiSecretKey;
    var jKey=JavaCast("string",thisSecretKey).getBytes("iso-8859-1");
    var key=createObject("java","javax.crypto.spec.SecretKeySpec");
    var mac=createObject("java","javax.crypto.Mac");
    key=key.init(jKey,"HmacSHA1");
    mac=mac.getInstance(key.getAlgorithm());
    mac.init(key);
    mac.update(jMsg);
    return lCase(binaryEncode(mac.doFinal(),'Hex'));
    //return Encrypt(arguments.argValue,getapiUsersDAO().getSecretKey(arguments.publicKey),'HMAC-SHA1');
    }
<cfset binaryValue = binaryDecode( 'C7EF1CADB27497B46FCD6F69516F96E0', "hex" )>
<cfset base64Value = binaryEncode( binaryValue, "base64" )>
<cfdump var="#base64Value#">

这里是另一种java方式 发现


问题是Feed必须具有前面的属性

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
如果您使用的是XmlWriter:

using (var xmlWriter = XmlWriter.Create(memoryStream))
{
    doc.WriteTo(xmlWriter);
}
您必须将XDocument保存到文件中,然后从文件中获取流。只有在这种情况下,XDocument才保留声明(Save()和WriteTo()方法的设计行为):


散列数据后,必须对其进行Base64编码。因此
base64Encode(md5Hash(myStr))
有关更多信息,请参阅和。您好,感谢您的回复。实际上我也试过了,但它仍然不符合亚马逊的哈希。我还尝试将其转换为ToBase64,然后对其进行散列,看看是否匹配。遗憾的是,事实并非如此。我也看到过类似的问题(在其他api中)。大多数问题都是由内容如何生成的问题引起的,而不是
hash
toBase64
函数。您可以发布完整的代码和API链接吗?不可以,
ToBase64
工作正常(尽管已弃用)。您只是使用不正确;)API可能说将散列字节返回为base64 ie
ToBase64(binaryDecode(hexValue,“hex”)
,这实际上与执行此操作的原始代码非常不同:
ToBase64(hexValue.getBytes(“UTF-8”)
Leigh,这是正确的。我采纳了你的建议,对ToBase64也很有效。我将用更正更新我的帖子。谢谢。两者都可以(尽管不推荐使用
toBase64
)。原始版本不起作用的原因是因为它是base64编码错误的东西。将散列字符串解码为十六进制时,得到16个字节(每对字符一个字节)。原始版本没有将字符串视为十六进制。将其解码为普通字符串产生32个字节(每个字符一个字节)。这就是为什么你的最后一个字符串总是比亚马逊的长很多,而且不匹配。我明白了,谢谢你的回复!我很有帮助,我更新了我的帖子,只是为了让其他人在遇到同样问题时更容易使用。再次感谢!好主意。(我出于类似的原因发布了解释,即为下一个家伙解释:)在这个家伙的情况下,不需要java
md5
哈希可以通过内置的CF函数来完成。OP使用CF的内置
hash()
函数,因此它们实际上不需要java。正确的java方式。。切片的方法不止一种。以前建议使用
javax.crypto
也很好。你是不是无意中在错误的线程上发布了这个?它似乎与哈希无关。它看起来也像C#,而不是CF或java。这与问题有关:您为提要传递的Content-MD5 HTTP头(C7EF1CADB27497B46FCD6F69516F96E0)与我们为提要计算的Content-MD5不匹配。忽略C#,将其视为peudo-code。它们的头没有问题。如果你看一下他们两年前的答案,问题是,所以上面这句话并不适用,因为它是关于构造xml的。
var memoryStream = new MemoryStream();
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("AmazonEnvelope",
...
using (var xmlWriter = XmlWriter.Create(memoryStream))
{
    doc.WriteTo(xmlWriter);
}
    var memoryStream = new MemoryStream();
    doc.Save(memoryStream);

    var file = Path.GetTempFileName();
    using (var fileStream = File.OpenWrite(file))
    {
        var buffer = memoryStream.GetBuffer();
        fileStream.Write(buffer, 0, (int)memoryStream.Length);
    }

    return File.Open(file, FileMode.Open, FileAccess.Read);