0

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

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

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

最终的 url 应该类似于

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

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

4

1 回答 1

0

这将是签名代码

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

wherecanonicalize(params)表示将String url 的参数转换为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

于 2016-06-29T20:00:29.777 回答