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