2011-11-28 96 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大小)更好。 –