假设我有一个移动应用程序,可以将照片保存在受密码保护的 AES-128 加密 PDF 文件中。为方便起见,我希望用户能够使用以前使用的密码加密文件而无需再次输入,但我也希望他们的数据在手机丢失或被盗时是安全的。显然,仅将密码以纯文本格式保存在首选项文件中不是一种选择。
在 PDF 中,AES 加密密钥的生成方式如下:
key = hash(password + file_id + permission_flags)
其中 hash 是 RC4 和 MD5 的组合,file_id 是一个随机的 128 位数字,以明文形式存储在文件中。还有一些额外的注意事项:文件中的每个对象都使用从主密钥派生的不同密钥进行加密,并且还有单独的“用户”和“所有者”密码,但为了简单起见,我们忽略所有这些,并假设permission_flags 不会因文件而异。
加密密码以供以后重复使用是不安全的,因为任何允许应用程序解密密码并使用它来生成加密密钥的方法都可以使用给定的 file_id 来生成它以进行解密。
想法:由于file_ids只是随机数,我们不必等待文件本身被创建后再生成它们,我们可以批量生成几千个file_ids,并在给定密码的情况下生成关联的密钥并将它们存储为元组在一个文件中。然后当用户保存文件时,我们可以读出一个key和file_id,用key对文件进行加密,将file_id写入文件,然后删除tuple。然后,如果攻击者获得了设备,他们将只拥有尚未保存的文件的密钥,而无法为已保存的文件生成密钥。一旦存储用完,用户只需重新输入密码。如果用户更改密码,该文件将被删除并使用新密码生成一个新文件。
这似乎可行,但我以前从未听说过这种技术,所以我不愿意将它用作“滚动你自己的加密货币”。如果用户备份他们的设备,这似乎也可能是一个问题,因为那时所有密钥都会有额外的副本浮动。
假设没有操作系统级别的系统级加密,那么这个密钥重用问题的最佳解决方案是什么?