我想知道对称密钥可以用来签名消息吗?我们可以使用共享密钥进行加密。另外,当使用对称密钥进行签名时,JAVA中可以使用什么API来加载密钥和对消息进行签名?
如果我使用来自java.security的签名,它有一个initSign接口,但它以公钥/私钥对中的私钥作为参数对消息进行签名。这里的密钥是对称密钥。
有什么建议吗?
发布于 2011-11-29 01:56:45
共享密钥可用于计算Message Authentication Code (MAC),然后可用于向知道相同共享密钥的另一方确认消息的完整性和真实性。与使用私钥创建并使用公钥验证的数字签名不同,MAC不提供不可否认性(任何可以验证MAC的人也可以为另一条消息生成MAC)。
有不同形式的消息验证码;可能最常用的变体是HMAC。
发布于 2011-11-29 02:10:12
也就是说,可以给你想要的:发送者和接收者都有一个共享密钥,发送者用秘密计算MAC并将其附加到消息上,接收者计算相同的MAC并将其与接收的消息进行比较。
虽然最常用的MAC类型(HMAC)基于哈希函数,但也有一些基于块密码,如CBC-MAC (这类似于CBC,但具有零初始化向量,仅使用最后一个块作为输出)。(正如noloader所说,CBC-MAC不是最安全的方式,请使用其他模式。)
在使用加密的大多数情况下,应该使用消息身份验证,因为许多加密方案容易受到选择明文攻击。
在Java语言中,可以使用javax.crypto.Mac类来计算(和检查) MAC。
发布于 2011-11-29 02:09:31
如果您希望使用symmentric key对消息进行签名,则需要使用基于AES (或3-key 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。
https://stackoverflow.com/questions/8299768
复制相似问题