2016-06-28 39 views
0

我有一個要求,其中我必須生成一個URL,其中所述參數中的一個是簽名和簽名必須在Java應用程序使用以下條件來產生散列:使用MD5和簽署使用私有證書

其它4應使用MD5對URL參數值進行散列處理(按照以下指定的順序),並使用專用證書進行簽名。 (簽名將是RSA實驗室的公鑰加密標準註釋#1中定義的DER編碼的PKCS#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 

我從來沒有上加密工作過,因此不知道如何下手。 有人可以幫助如何實現這一點。

+1

關於「我以前從來沒有在密碼術上工作過」的一點有點像足科醫生說「我從來沒有從事過心臟手術之前」,但我只是在SurgeryOverflow中問,得到它有多難?對。 IOW,獲得加密領域專家。 – zaph

+0

@ zaph在學習新東西時出了什麼問題。我沒有密碼專家,這就是爲什麼我要問這裏的專家。 – Neel

+0

好的一點是,如果學習是關於什麼的,並且有許多書籍和許多可用的信息。但是,如果你只是想快速解決問題,那麼即使是那些有經驗的加密人員犯了一個錯誤,也是非常容易的。加密錯誤不僅僅是一個錯誤,即某些東西無法正常工作,或者在需要重新啓動的情況下發生崩潰,成功的攻擊是永久性的,並將所有用戶置於危險之中。用戶信任開發人員,而信任是開發人員的責任。 – zaph

回答

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)代表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

相關問題