2011-11-28 94 views
8

我想知道可以使用對稱密鑰來簽署消息嗎?我們可以使用共享密鑰來加密。另外,當使用對稱密鑰進行簽名時,可以在JAVA中使用哪種API來加載密鑰並簽署消息?使用對稱密鑰(AES -128)簽名並驗證消息

如果我使用了來自java.security的Signature,它有一個api initSign,但是它使用公鑰/私鑰對中的私鑰作爲簽名消息的參數。這裏的關鍵是對稱密鑰。

任何指針?

回答

11

共享密鑰可以用來計算Message Authentication Code (MAC),然後可以用它來確認消息的完整性和真實性給另一方知道相同的共享密鑰。與使用私鑰創建並使用公鑰驗證的數字簽名不同,MAC不提供不可否認性(任何可以驗證MAC的人也可以爲其他消息生成MAC)。

有不同形式的消息認證碼;可能最常用的變體是HMAC

1

如果要使用對稱密鑰簽署消息,則需要使用基於AES(或3鍵TDEA或Cameilla)的CMAC。 CMAC是在分組密碼之上構建的消息認證碼(MAC)。如果您也使用AES/3TDEA/Cameilla進行加密,您通常使用CMAC(即它很方便)。

您也可以使用HMAC。 HMAC是在散列之上構建的消息認證碼(MAC)。您將使用HMAC是已經存在於程序中的哈希(即,它很方便)。

當我在程序中同時存在Block Cipher和Hash時,我通常使用HMAC,因爲它的速度更快。

最後(爲了完整),請勿使用MD5。它的破碎(儘管在自由軟件世界有許多人認爲)。 SHA-1不再被NIST,NESSIE和ECRYPT等機構批准用於新應用。使用SHA-2散列家族,或使用惠而浦。

對於java的具體東西,請參閱Java Cryptography Extensions

6

對稱算法不能給出非對稱簽名方案給出的不可抵賴性,即消息的接收者不能證明他自己沒有創建消息,因爲他們必須知道該方案。

這就是說,一個message authentication code(MAC)可以給你想要的東西:發送者和接收者有一個共享密鑰,發送者計算MAC與祕密並將其追加到消息,接收方計算相同的MAC並將其與收到的消息進行比較。

雖然最經常使用的MAC類型(HMAC)基於哈希函數,但也有一些基於像AES這樣的分組密碼,如CBC-MAC(這與CBC類似,但是初始化向量僅爲零,並且僅使用最後一個塊作爲輸出)。 (正如noloader所說,CBC-MAC不是這樣做的最安全的方式,使用其他模式。)

在大多數情況下,您應該使用消息身份驗證,因爲許多加密方案容易受到攻擊,明文攻擊。

在Java中,可以使用javax.crypto.Mac類來計算(並檢查)MAC。

+1

CBC-MAC因可變長度消息而中斷。 CMAC是CBC-MAC正確的。 – jww

+0

對不起,但我仍然不清楚。什麼決定了用於HMAC的密鑰大小?我知道我可以通過CMAC使用HMAC。但是我擁有的鑰匙是aes 128.可以使用嗎?例如:SecretKey密鑰=新的SecretKeySpec(密鑰,「AES」) – user839917

+0

最好,你應該使用一個不同的(獨立的)密鑰進行MAC和加密,儘管HMAC很可能不同,所以使用相同的密鑰不會產生問題。您可以使用任何您想要的HMAC密鑰長度(達到散列函數塊的長度)(儘管我不知道您的實現是否支持它),它將簡單地用零填充到散列函數的塊長度。較大的密鑰提供更高的安全性,但不會比散列函數輸出大小(= MAC大小)更好。 –