我正在编写一个小型桌面应用程序,该程序应能够加密数据文件并使用密码保护它(即必须输入正确的密码才能解密)。 我希望加密后的数据文件是独立且可移植的,因此认证必须嵌入到文件中(或者我这样假设)。
我有一个看起来可行并且基于我所知道的逻辑似乎是合理的策略(可能足够危险),但我不知道它是否实际上是一个好设计。 那么告诉我:这种做法是否可行? 是否有更好/最佳的方法?
步骤1:用户输入明文密码,例如“MyDifficultPassword” 步骤2:应用程序将用户密码哈希化,并使用该值作为对称密钥来加密/解密数据文件。例如,“MyDifficultPassword” -->“HashedUserPwdAndKey”。 步骤3:应用程序将步骤2中的哈希值再次哈希并将新值保存在数据文件头部(即未加密部分的数据文件中),并使用该值验证用户的密码。例如,“HashedUserPwdAndKey” -->“HashedValueForAuthentication”。
基本上,我是从实现网站密码的常见方式推断出来的(如果您没有使用OpenID的话),即在DB中存储用户密码的(加盐)哈希值并永远不保存实际密码。 但是,由于我使用了哈希的用户密码作为对称加密密钥,因此我无法在认证中使用相同的值。 因此,我再次对其进行哈希处理,基本上像处理另一个密码一样,并将双重哈希值保存在数据文件中。 这样,我可以将文件带到另一台PC并通过简单地输入我的密码来解密它。
那么,这个设计是否相当安全,或者很幼稚,或者介于两者之间? 谢谢!
编辑:澄清和关于Salt的跟进问题。我曾认为盐值必须保密才能发挥作用,但您的回答和链接表明这并非如此。例如,erickson(下面)提供的这份规范 指出:
我有一个看起来可行并且基于我所知道的逻辑似乎是合理的策略(可能足够危险),但我不知道它是否实际上是一个好设计。 那么告诉我:这种做法是否可行? 是否有更好/最佳的方法?
步骤1:用户输入明文密码,例如“MyDifficultPassword” 步骤2:应用程序将用户密码哈希化,并使用该值作为对称密钥来加密/解密数据文件。例如,“MyDifficultPassword” -->“HashedUserPwdAndKey”。 步骤3:应用程序将步骤2中的哈希值再次哈希并将新值保存在数据文件头部(即未加密部分的数据文件中),并使用该值验证用户的密码。例如,“HashedUserPwdAndKey” -->“HashedValueForAuthentication”。
基本上,我是从实现网站密码的常见方式推断出来的(如果您没有使用OpenID的话),即在DB中存储用户密码的(加盐)哈希值并永远不保存实际密码。 但是,由于我使用了哈希的用户密码作为对称加密密钥,因此我无法在认证中使用相同的值。 因此,我再次对其进行哈希处理,基本上像处理另一个密码一样,并将双重哈希值保存在数据文件中。 这样,我可以将文件带到另一台PC并通过简单地输入我的密码来解密它。
那么,这个设计是否相当安全,或者很幼稚,或者介于两者之间? 谢谢!
编辑:澄清和关于Salt的跟进问题。我曾认为盐值必须保密才能发挥作用,但您的回答和链接表明这并非如此。例如,erickson(下面)提供的这份规范 指出:
因此,基于密码的密钥派生在这里定义为一个函数,其参数是密码、盐值和迭代计数器。其中后两个量不需要保密。
这是否意味着我可以将盐值存储在同一位置/文件中作为哈希密钥,并且仍然比使用没有盐值的哈希更安全?这是怎么做到的呢?
稍微详细说说:加密文件不打算与他人共享或解密,它是单用户数据。但我想在我无法完全控制的共享环境中部署它(例如,在工作中),并且通过简单地复制文件来迁移/移动数据(以便我可以在家中、不同的工作站等地使用它)。