【问题标题】:Server-Side-Encryption-Customer-Key : The calculated MD5 hash of the key did not match the hash that was providedServer-Side-Encryption-Customer-Key :计算出的密钥 MD5 哈希与提供的哈希不匹配
【发布时间】:2014-07-08 14:00:01
【问题描述】:

我使用 Jets3t 作为第三方。我想使用客户密钥设置服务器端加密。我正在使用以下代码,但总是收到消息 “计算的密钥的 MD5 哈希与提供的哈希不匹配。”

我在 base64-encoded 和 customer-key-md5 based64-encoded(md5(customer-key)) 中使用 customer key ="123456"

x-amz-copy-source​-server-side​-encryption​-customer-key 包含此标头可为 Amazon S3 提供 base64 编码的加密密钥以用于解密源对象。此加密密钥必须是您在创建源对象时提供的 Amazon S3 密钥;否则,Amazon S3 将无法解密该对象。

x-amz-copy-source-​服务器端​-加密​-customer-key-MD5
包含此标头以根据 RFC 1321 提供加密密钥的 base64 编码的 128 位 MD5 摘要。

代码在这里

try {
    S3Copy objS3Copy = new S3Copy((S3Service)new RestS3Service(new ProviderCredentials("xxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxx") {
        @Override
        protected String getTypeName() {
        }
        @Override
        protected String getVersionPrefix() {
        }
    }), new BucketExplorerMain());
    Map<String, Object> newMetadata = new HashMap<String, Object>();
    newMetadata.put("ETag","c2fb88d3d9832648cb0b89957479c16b");
    newMetadata.put("Content-Length","1326017");
    newMetadata.put("accept","eng");
    newMetadata.put("request-id","039A1F919BAB9D1A");
    newMetadata.put("Last-Modified","Thu Feb 13 17:50:17 IST 2014");
    newMetadata.put("Date","Tue Jul 08 17:05:10 IST 2014");
    newMetadata.put("id-2","YpdNQhxKnATh6O9Pp4b/6GbDDcIcGh+UkTMQZpOyij4oNPsdOQbLGavfDSxSiuGS");
    newMetadata.put("Content-Type","text");
    newMetadata.put("x-amz-server-side-encryption-customer-algorithm","AES256");
    String sKey="123456";
    //String sEncryKey = ServiceUtils.toBase64(sKey.getBytes());
    String sEncryKey = Base64.encodeBase64String(sKey.getBytes());
    newMetadata.put("x-amz-server-side-encryption-customer-key",sEncryKey);
    try {
        //String sbased64MD5 = ServiceUtils.toBase64(ServiceUtils.computeMD5Hash(sKey.getBytes()));
         String sbased64MD5=Base64.encodeBase64String(ServiceUtils.computeMD5Hash(new ByteArrayInputStream(sKey.getBytes())));
        newMetadata.put("x-amz-server-side-encryption-customer-key-MD5",sbased64MD5);
    } catch (Exception ex) {
    }
    try {
        boolean bsuccess = objS3Copy.updateMeta("BucketName", "obj.JPG", newMetadata);
    } catch (Exception ex) {
    }

} catch (Exception ex) {
}

我的价值观是:对于键 123456

x-amz-server-side-encryption-customer-algorithm: AES256
x-amz-server-side-encryption-customer-key: MTIzNDU2
x-amz-server-side-encryption-customer-key-MD5:  RTEwQURDMzk0OUJBNTlBQkJFNTZFMDU3RjIwRjg4M0U=
Ref: 
http://www.base64decode.org/
http://www.convertstring.com/Hash/MD5  
E10ADC3949BA59ABBE56E057F20F883E is MD5 of 123456
 The calculated MD5 hash of the key did not match the hash that was provided.

用以下行更改注释行后..我的代码工作正常。

谢谢

【问题讨论】:

    标签: encryption amazon-s3 amazon


    【解决方案1】:

    MD5 输出的长度为 16 个字节,而 Base64 值RTEwQURDMzk0OUJBNTlBQkJFNTZFMDU3RjIwRjg4M0U= 实际上编码了 32 个字节。如果您使用相同的编码而不是混合使用 hex 和 base64 来打印这些值,您可以自己找到它。

    我不知道 ServiceUtils.computeMD5Hash() 是在哪里定义的,但它返回的是 MD5 哈希的大写十六进制表示,而不是字节数组。

    md5( "123456".getBytes() )0hE10ADC3949BA59ABBE56E057F20F883Ebase64( "E10ADC3949BA59ABBE56E057F20F883E".getBytes() )RTEwQURDMzk0OUJBNTlBQkJFNTZFMDU3RjIwRjg4M0U=,如下代码所示:

    MessageDigest md5 = MessageDigest.getInstance( "MD5" );
    String keyAsText = "123456";
    byte[] keyAsBytes = keyAsText.getBytes();
    byte[] digestAsBytes = md5.digest( keyAsBytes );
    String digestAsHex = DatatypeConverter.printHexBinary( digestAsBytes );
    System.out.printf( "hex(md5(\"%s\") = %s%n", keyAsText, digestAsHex );
    byte[] digestAsHexAsBytes = digestAsHex.getBytes();
    String digestAsHexAsBytesAsBase64 = DatatypeConverter.printBase64Binary( digestAsHexAsBytes );
    System.out.printf( "base64(\"%s\") = %s%n", digestAsHex, digestAsHexAsBytesAsBase64 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多