1

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

除了删除所有现有数据之类的激烈操作之外,我能想到的唯一其他方法是(使用密码数据时调用的包装伪代码。):

# 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)

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

4

1 回答 1

2

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

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