我正在尝试构建一个AES文件加密/解密。我使用了一些简洁的教程和指南,我想知道Key
和SecretKey
之间的区别。对于上下文,我使用了以下帖子,第一个使用 SecretKey (Duncan's reply) ,第二个使用 Key (Shankar's reply) 和一些keyValue
字节数组。
我的猜测是,只使用Key
(shankar的答案)来训练某些值并不像使用SecretKey
随机执行此操作一样安全(Duncan' s回答)。
问题:密钥和密钥之间的区别是什么,以及在第二个帖子(密钥)中拥有keyValue
的原因是什么?可以Key
不是随机生成的,就像Duncan对SecretKey
所做的那样?
答案 0 :(得分:5)
AES密钥应包含与攻击者无法区分的字节。某些密钥(例如DES和三重DES密钥)不是完全随机的,因此需要由SecretKeyFactory
或KeyGenerator
生成(尽管对于DES,许多实现只是忽略奇偶校验位并允许随机价值观)。但是,也可以通过直接使用SecretKeySpec
并将其用作SecretKey
来创建随机对称密钥。这是一个有用的快捷方式,但要注意它可能与密钥生成或硬件存储(HSM,智能卡)不兼容。
如果您在现场随机创建密钥或使用静态密钥取决于您的密钥管理方案。密钥管理是任何加密方案中最重要的事情之一。 “硬编码”应用程序源中的密钥当然不如安全地生成或存储密钥安全。通常只有在没有其他方式或测试/演示目的时才会执行。如何处理密钥管理完全取决于用例;没有知道如何以及如何使用密钥,没有“最佳”。例如,如果以后无法检索键值,则Duncan的随机密钥生成几乎没用。
至于Key
和SecretKey
; Key
是Secretkey
,PublicKey
和PrivateKey
的基础界面。 SecretKey
通常由如上所示的随机字节组成。 PublicKey
和PrivateKey
始终是非对称密钥对的一部分。通常,这些密钥基于数论,它们由多个组件组成。例如,RSAPublicKey
由模数和公共指数(作为BigInteger
值)组成。
至于您需要:使用仍然符合您需求的最高级别界面,选择在特定位置最有意义的那个。例如,您只需要RSAPublicKey
来获取RSA特定属性,例如模数。否则,您也可以使用也接受PublicKey
的{{1}}变量。这样你就可以使你的代码(相对)算法不可知。