簡體   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