使用对称密钥(AES -128)签名并validation消息

我想知道可以使用对称密钥来签名消息吗? 我们可以使用共享密钥加密。 此外,当对称密钥用于签名时,可以在JAVA中使用哪些API来加载密钥并对消息进行签名?

如果我使用java.security中的Signature,它有一个api initSign,但它从公钥/私钥对中取私钥作为签名消息的参数。 这里的关键是对称密钥。

有什么指针吗?

共享密钥可以用于计算消息认证码(MAC) ,然后可以用于向消息知道同一共享秘密的另一方确认消息的完整性和真实性。 与使用私钥创建并使用公钥validation的数字签名不同,MAC不提供不可否认性(任何可以validationMAC的人也可以为另一个消息生成MAC)。

有不同forms的消息认证码; 可能最常用的变体是HMAC 。

对称算法不能给出非对称签名方案给出的不可否认属性,即消息的接收者不能certificate他自己没有创建消息,因为他们必须知道该方案。

也就是说, 消息身份validation代码 (MAC)可以为您提供所需内容:发送方和接收方都有共享密钥,发送方计算带有密钥的MAC并将其附加到消息中,接收方计算相同的MAC并进行比较它与收到的消息。

虽然最常用的MAC类型( HMAC )基于散列函数,但也有一些基于类似AES的分组密码,如CBC-MAC (这类似于CBC,但初始化矢量为零,仅使用最后一个阻止作为输出)。 (正如noloader所说,CBC-MAC不是最安全的方式,使用其他模式。)

在大多数使用加密的情况下,您应该使用消息身份validation,因为许多加密方案容易受到选择明文攻击。

在Java中,可以使用javax.crypto.Mac类计算(并检查)MAC。

如果要使用对称密钥对消息进行签名,则需要使用基于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系列哈希,或使用Whirlpool。

有关Java特定的内容,请参阅Java Cryptography Extensions 。