蛮力是检测加密的唯一合理方法吗?

时间:2012-07-24 16:23:53

标签: encryption passwords brute-force

旧版本的应用程序在其数据库中以明文形式存储了一些密码。我已经编写了一个更新版本,可以在创建新条目时对密码进行加密,但是我没有直接访问数据库来手动加密已存在的条目。当更新生效时,它将尝试解密明文密码并崩溃。

如果没有像删除所有现有数据这样做得很厉害,我能想到的唯一其他方法就是这个(使用密码数据时会调用包装器伪代码。):

# data refers to the password data, either encrypted or plain
if data length < AES.block_size:
    # (Shorter than initialization vector, definitely not encrypted.)
    open database and replace password entry with encrypt(data)
    login(username, data)
else:
    try: # try plaintext first
        login(username, data)
    except AuthenticationError:
        login(username, decrypt(data))
    else: #plain text worked, encrypt data for future use.
        open database and replace password entry with encrypt(data)

保持此代码以解决在运行一次之后消失的问题似乎是一种耻辱。是否有任何其他方法可以确保密码被加密并且只解密需要它的密码?

1 个答案:

答案 0 :(得分:2)

在这种情况下,我会执行以下操作之一,具体取决于客户端和所涉及的系统:

  • 设置加密密码,删除所有现有密码,并让每个人输入新密码。我更喜欢这个,因为密码很简单,随着时间的推移可能已经看到或分享了。
  • 运行一次性脚本以加密系统中的每个密码。这种方式永远不会混合。
  • 使用加密方法作为前缀的新加密密码,例如: “SHA1”。您冒着与密码开头具有相同文本的人的风险,但这不太可能。