不,您应该使用a SecureRandom
来从静态数据中派生密钥的想法非常糟糕:
使用"SHA1PRNG"
的密钥导出函数已经知道生产Android上的几个版本的问题,并且可能无法在任何其他Java RE。
那么,您应该怎么做呢?
如果种子是通过例如密钥协商算法(例如Diffie-Hellman或ECDH)生成的,则首选选项4。
请注意,对于选项3 PBKDF2,明智的做法是仅保留ASCII密码。这是由于Oracle的PBKDF2实现不使用UTF-8编码这一事实。
至于选项4,我已经帮助将所有好的KBKDF添加到BouncyCastle库中,因此,如果您可以将BouncyCastle添加到您的类路径和/或已安装的安全提供程序列表中,则无需自己实现KBKDF。目前最好的KBKDF可能是HKDF。如果无法将BouncyCastle添加到类路径中,则可能需要将派生数据上SHA-256输出的最左边字节用作“穷人” KDF。