2011-03-17 156 views
3

我正在研究Java RCP应用程序。用户需要使用智能卡对自己进行身份验证才能访问应用程序。在这里面,他可以打开/保存需要加密存储的文件。如何安全地存储加密密码

目前,我使用带有硬编码密码的基于密码的AES加密。 这显然不安全,所以我需要一种不同的方法来加密/解密文件。

什么引起这个问题是有要满足几个条件:

  • 没有保证的网络连接(必须处于离线模式下可用)
  • 多个用户必须有权访问文件(所以不公钥/私钥加密)
  • 不应该有用于所有文件的一个“主” - 键

编辑: 我不需要很高的安全级别。攻击者只需要打开分布式JAR文件并以纯文本形式获取密钥即可获得密钥。

任何提示将不胜感激。

+0

不要存储密码,存储密码的散列。 – 2011-03-17 21:47:26

+0

我需要密码来重建密钥并解密文件。所以哈希不起作用。 – st3ve 2011-03-17 21:49:13

+0

使用散列作为键。无论哪种方式,如果_they_找到你的钥匙,你可能会被拧紧,不管它的存储格式如何;不要存储密钥,但每次通过散列给定的密码重新构建它 - 有效的密码=正确的密钥。 – 2011-03-17 21:50:32

回答

1

对于每个文件,创建一个新的密钥。用该密钥加密文件(使用AES)。

然后,对于允许读取文件的每个用户,使用其公钥(对应于其智能卡上的私钥)对新密钥进行加密。将这些加密的密钥与文件一起存储。

当用户想要读取文件时,软件使用他的智能卡恢复用于该文件的内容加密密钥。

文件格式可以使用PKCS#7的加密消息语法或OpenPGP。

+0

这帮了很大忙。非常感谢你! – st3ve 2011-03-17 23:34:18

0

警告:我对安全性不甚了解,这只是一种想法。

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

这样,您可以使用来自每个用户的公钥加密来传递密码,该密码不存储在系统中的任何位置,彼此独立保护文件,而不依赖于外部来源。

+0

如果我对你有所了解,那么如果一个文件只需要被** single **用户解密,这将是一个好方法。在我的应用程序中,单个文件需要被许多用户读取。很不好,这使得你的建议无法使用。 – st3ve 2011-03-17 22:01:23

相关问题