如何安全地存储加密密码

3
我正在开发一个Java RCP应用程序。用户需要使用智能卡进行身份验证才能访问该应用程序。在此过程中,他可以打开/保存需要加密存储的文件。
目前,我正在使用基于密码的AES加密和硬编码密码。这显然不安全,因此我需要另一种方法来加密/解密文件。
导致这个问题的原因是有几个要求必须满足:
- 没有保证的网络连接(必须在离线模式下可用) - 多个用户必须能够访问文件(因此不能使用公钥/私钥加密) - 不应该有一个“主”密钥用于所有文件
编辑:我不需要非常高的安全级别。它只需要比攻击者轻松地打开分发的JAR文件并以明文形式获取密钥更难一些。
任何提示都将不胜感激。

不要存储密码,而是存储密码的哈希值。 - Grant Thomas
我需要密码来重建密钥并解密文件。因此,哈希值是不起作用的。 - st3ve
使用哈希作为密钥。无论以何种格式存储,如果他们找到了你的密钥,你都有可能遭受损失;不要存储密钥,而是通过对给定密码进行哈希处理来每次重建它 - 有效密码=正确的密钥。 - Grant Thomas
使用哈希作为密钥并存储哈希值,与使用密码作为密钥并存储密码是相同的。 - Zoe
2个回答

1
对于每个文件,创建一个新的密钥。使用该密钥(使用AES)加密文件。
然后,对于每个被允许读取文件的用户,使用其公钥(与其智能卡上的私钥相对应的公钥)加密新密钥。将这些加密密钥与文件一起存储。
当用户想要读取文件时,软件使用他的智能卡恢复用于文件的内容加密密钥。
文件格式可以使用PKCS#7的加密消息语法或OpenPGP。

0

注意:我对安全方面不是很精通,这只是我想到的一个建议。

作为一个建议,可以将每个文件的密码设置为包含已知盐的哈希值,该盐是为每个文件随机生成的,并且还有一个单一的口令短语,该短语被单独加密用于每个用户。您可以安全地在本地存储随机盐,因为这些不是文件的密钥,也没有用户知道解锁文件的口令。通过使用公钥加密来加密和签名口令短语,您可以对每个用户和每个文件进行身份验证和访问控制。

这样,您可以使用每个用户的公钥加密传递口令短语,该短语不会存储在系统中的任何位置,独立地保护每个文件,并且不依赖外部来源。


如果我理解正确的话,那么这个方法对于仅需要单个用户解密的单个文件是一个很好的方法。在我的应用程序中,一个文件需要被多个用户阅读。不幸的是,这使得你的建议无法使用。 - st3ve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接