【问题标题】:How to store crypto password safely如何安全地存储加密密码
【发布时间】:2011-03-17 21:42:18
【问题描述】:

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

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

引起这个问题的原因是有几个要求要满足:

  • 不保证网络连接(必须在离线模式下可用)
  • 多个用户必须有权访问文件(因此没有公钥/私钥加密)
  • 不应为所有文件使用一个“主”密钥

编辑: 我不需要非常高的安全级别。攻击者获取密钥应该比只打开分布式 JAR 文件并以纯文本形式获取密钥要困难一些。

任何提示将不胜感激。

【问题讨论】:

  • 不要存储密码,存储密码的哈希值。
  • 我需要密码来重建密钥和解密文件。所以哈希是行不通的。
  • 使用哈希作为键。无论哪种方式,如果 他们 找到您的密钥,您可能会被搞砸,不管它的存储格式如何;不要存储密钥,而是每次通过散列给定密码来重建它 - 有效密码 = 正确的密钥。
  • 使用hash作为key,然后存储hash与使用password作为key,存储密码是一样的。

标签: java encryption key keystore


【解决方案1】:

为每个文件创建一个新密钥。使用该密钥加密文件(使用 AES)。

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

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

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

【讨论】:

  • 这很有帮助。非常感谢!
【解决方案2】:

警告:我不精通安全,这只是我的想法。

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

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

【讨论】:

  • 如果我没听错的话,如果单个文件只需要单个用户解密,这将是一个好方法。在我的应用程序中,一个文件需要被许多用户读取。糟糕的是,这使您的建议无法使用。
猜你喜欢
  • 2014-10-18
  • 2015-07-04
  • 1970-01-01
  • 2018-05-13
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多