我正在开发一个应用程序,它需要从用户提供的密码中派生私钥/公钥对,然后使用公钥加密一些文本(长度可达1000个字符),使其只能由配对私钥解密。密码和私钥不会存储在任何地方,因此没有用户的密码,任何访问数据库的人都无法解密文本。我知道我需要使用KDF算法来生成密钥,并使用某种公钥加密算法来加密/解密。
我知道有几种安全算法,但也有一些被认为是破解和不安全的算法。对于KDF和加密,我可以使用哪些最安全的算法?我应该遵循哪些最佳实践来确保数据尽可能安全?
我将使用加密算法的Java标准库实现。
发布于 2019-09-25 12:25:56
就个人而言,就像公钥密码学一样,我认为应该使用RSA。造成这种情况的原因有多种:
如果你愿意的话,你可以使用椭圆曲线密码术。
就KDF而言,PBKDF2HMAC是最常用的标准。Argon2,氪和AES-KDF也被广泛使用.
目前,我所有的应用程序都使用PBKDF2HMAC,但我正在迁移到Scrypt,因为它更安全。
发布于 2019-09-25 05:41:15
散列一次密码即可。
我将使用椭圆曲线来开发我的语句,因为对于较小的密钥(EC的256位和RSA的3072位具有相同的安全性。),它们与RSA一样健壮,而且计算速度更快。此外,RSA密钥要求不同,因为您需要找到素数。
在Curve25519文档中,您可以为私钥生成提供以下内容:
计算密匙。在您的程序中,要生成一个32字节的Curve25519密钥,首先从密码安全源生成32个秘密随机字节:我的机密0,mysecret1,.,mysecret31。然后执行mysecret0 &= 248;mysecret31 &= 127;mysecret31 |= 64;创建一个32字节的Curve25519秘密密钥mysecret0、mysecret1、.、mysecret31。
所以你只需要256位,然后修改几位。要获得256位,只需使用KDF (如Argon2 )对密码进行散列。这使得暴力变得更加困难,因为您可以选择一个迭代次数和其他参数,并相应地选择以满足您的安全需求。
https://security.stackexchange.com/questions/218569
复制相似问题