繁体   English   中英

使用md5散列并使用专用证书签名

[英]Hashing using md5 and sign using private certificate

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

应该使用MD5对其他4个URL参数值进行哈希处理(按以下指定的顺序),并使用专用证书进行签名。 (签名将是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

我之前从未从事密码学方面的工作,因此不知道如何开始。 有人可以帮助实现这一目标。

这将是签名代码

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

canonicalize(params)意味着将url的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,以了解如何规范化URL的示例

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM