使用md5进行哈希并使用私有证书进行签名

时间:2016-06-28 12:54:33

标签: java cryptography md5 string-hashing pkcs#1

我有一个要求,其中我必须生成一个URL,其中一个参数是签名,并且必须使用Java应用程序中的以下要求生成签名:

其他4个URL参数值应使用MD5进行散列(按下面指定的顺序)并使用私有证书进行签名。 (签名将是RSA实验室的公钥加密标准注释#1中定义的DER编码的PKCS#1块。)应使用base64将得到的摘要转换为ASCII字符集,然后进行编码以符合HTTP URL字符集限制。

Order                   Parameter
1                       [queryparameter1]
2..                     [queryparameter …] *
3                       Expiration

最终的网址应该类似于

https://<ServerName>:<Port>/imageRet/pod?ID=123456789&build=XHB&date=201102151326&expiration=20110218155523&signature=H767dhghjKJ#23mxi

我以前从未参与过密码学,因此不知道如何开始。 有人可以帮助如何实现这一目标。

1 个答案:

答案 0 :(得分:0)

这将是签名代码

Signature sig = Signature.getInstance("MD5withRSA");
sig.initSign(privateKey);
sig.update(canonicalize(params));
byte signature[] = sig.sign();
String signatureB64UrlEncoded = Base64.getUrlEncoder().encodeToString(signature);

其中canonicalize(params)表示将网址的String参数转换为byte[]服务指定的方式。你还没有提供细节。这一步并非微不足道,因为等效的URL可能会生成不同的签名。

例如

 q=hello%20world   --> Qazz_tVB-guYai5oW0Eef6BbVP ...
 q=hello world     --> JJWDEPMQDmffcsjR0dP3vnrkFT ...

示例实现,但肯定无效......

//Convert params[] to byte[] converting each String to byte with default charset and concatenating results
public byte[] canonicalize(String params[] ) throws IOException{
    final ByteArrayOutputStream out = new ByteArrayOutputStream();

    for (String param: params){
        out.write(param.getBytes());
    }
    return out.toByteArray();
}

查看Amazon AWS以查看规范化网址的示例

如果您最终决定使用更安全的算法,只需将MD5withRSA替换为SHA256withRSA