我有一个要求,其中我必须生成一个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
我以前从未参与过密码学,因此不知道如何开始。 有人可以帮助如何实现这一目标。
答案 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