2

有谁知道如何计算需要与 Amazon 的 SubmitFeed API 一起使用的 MD5 哈希?我正在使用 ColdFusion,每次我计算 MD5 哈希值时,它都与亚马逊计算的结果不匹配。

亚马逊响应此错误:

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))。我缺少一个步骤吗?

4

6 回答 6

2

问题是 Feed 必须先于

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

即使将其添加为声明也是不够的

var memoryStream = new MemoryStream();
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("AmazonEnvelope",
...

如果您使用的是 XmlWriter:

using (var xmlWriter = XmlWriter.Create(memoryStream))
{
    doc.WriteTo(xmlWriter);
}

您必须将 XDocument 保存到文件,然后从文件中获取流。只有在这种情况下,XDocument 才保留声明(Save() 和 WriteTo() 方法的设计行为):

    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);
于 2015-01-15T20:50:26.250 回答
2
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');
    }
于 2013-01-15T20:27:30.263 回答
1

这是在http://www.kba.suche-spezialwerkzeug.de/pdf/MWSDeveloperGuide.pdf上找到的另一种 java 方式

public static String computeContentMD5HeaderValue(FileInputStream fis)
        throws IOException, NoSuchAlgorithmException {
    DigestInputStream dis = new DigestInputStream(fis,
            MessageDigest.getInstance("MD5"));
    byte[] buffer = new byte[8192];
    while (dis.read(buffer) > 0)
        ;
    String md5Content = new String(
            org.apache.commons.codec.binary.Base64.encodeBase64(dis.getMessageDigest().digest())
            );
    // Effectively resets the stream to be beginning of the file via a
    // FileChannel.
    fis.getChannel().position(0);
    return md5Content;
}
于 2014-10-27T11:18:01.023 回答
1

我检查了这个在线工具,你只需要以 base64 编码发送那个 MD5。它目前只是十六进制编码。

恐怕我不知道 ColdFusion 的做法是什么,也许是这样: SHA or MD5 Digests in ColdFusion

于 2013-01-14T21:55:20.953 回答
1

这是我为使其正常工作所做的工作:

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

并且砰它匹配亚马逊的 MD5 哈希。

于 2013-01-14T22:47:36.823 回答
0

这将给出你想要的输出。

<cfset binaryValue = binaryDecode( 'C7EF1CADB27497B46FCD6F69516F96E0', "hex" )>
<cfset base64Value = binaryEncode( binaryValue, "base64" )>
<cfdump var="#base64Value#">
于 2013-01-16T11:44:23.480 回答