旧版本的应用程序有一些密码以明文形式存储在其数据库中。我已经编写了一个更新版本,可以在创建新条目时对密码进行加密,但是我无法直接访问数据库来手动加密已经存在的条目。当更新上线时,它会尝试解密明文密码,然后崩溃。
除了删除所有现有数据之类的激烈操作之外,我能想到的唯一其他方法是(使用密码数据时调用的包装伪代码。):
# 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)
保留此代码以解决运行一次后就消失的问题似乎是一种耻辱。是否有任何其他方法可以确保密码被加密并且只解密需要它的密码?