使用私钥/公钥加密来保存密码会有问题吗?

时间:2011-12-16 17:38:38

标签: passwords public-key-encryption

使用像md5这样的散列算法,我们会遇到有限的熵,这意味着很长的密码可能会导致哈希值,这些哈希值可以通过较短的密码重新生成。

我当时想知道在服务器上存储使用公钥/私钥加密的公钥加密的密码是否是个好主意。由于不需要解密,因此可以丢弃密钥以避免在服务器遭到入侵时丢失密码。

然而,这种方法似乎没有被广泛使用。那么有缺点吗?如果是,那么哪个?

2 个答案:

答案 0 :(得分:3)

有几个缺点。其中:

  • 您现在拥有必须受到保护的令牌。如果有人获取了您的密钥,则他们拥有使用该密钥加密的每个密码。如果你“丢失”私钥,非对称加密不是一个问题,但你最好祈祷它的所有副本都消失了。哈希不能解密,期间。
  • 加密密码可以是几乎任何长度,因此需要数据库中的相当大的字段(或明文的长度限制)才能被存储。哈希有一个已知的长度。
  • 如果您可以解密密码,您就知道了。如果有人使用该密码闯入别的东西,那么知道密码属于该用户的每个人都是嫌疑人。现在意味着你。即使您使用单向加密作为哈希,您最好能够证明您无法解密它 - 然后,如果您不想解密它,为什么要加密?

通常,当您必须知道其他内容的密码时,您只选择加密而不是哈希 - 例如,当您使用它代表用户登录其他系统时。理想情况下,你首先要耗尽所有其他可能性。

答案 1 :(得分:1)

总是存在这样的缺点:计算加密哈希比使用公钥加密算法加密小密码要便宜得多。

其次,您仍然受到公钥加密的有限熵的影响,您的位串仍将受到限制。如果您需要更多位,请使用内部状态更大的哈希值(SHA-512,Whirlpool等...)

第三,您需要将公钥与密码一起存储,这会导致相当大的存储成本(考虑到公钥的大小),以及您是否考虑对所有密码使用相同的公钥,不要 - 如果该密钥被泄露,那就结束了。

另一个考虑因素:没有密码大小限制,甚至填充块加密也会导致不同密码的存储大小不同,这可能会使数据库索引变得更加困难(可能不是一个大问题,但要保持记住)。

最后,biggie - 哈希意味着明确地破坏输入数据中的所有结构,这正是您在存储验证密码时所需要的。加密算法不这样做 - 它们会对数据进行转换,使其无法理解而没有正确的密钥,这与您尝试使用它的方式相悖。

所以,不,不应该使用这种方法,因为它是弄巧成拙的。使用内部状态更大的哈希值。