【发布时间】:2010-09-08 12:35:04
【问题描述】:
我正在编写一个小型桌面应用程序,它应该能够加密数据文件并使用密码保护它(即必须输入正确的密码才能解密)。我希望加密的数据文件是独立且可移植的,因此必须将身份验证嵌入到文件中(或者我假设如此)。
根据我所知道的,我有一个看起来可行且合乎逻辑的策略(这可能足以造成危险),但我不知道它是否真的是一个好的设计。所以告诉我:这疯了吗?有更好/最好的方法吗?
- 第一步:用户输入明文密码,例如“我的难密码”
- 第 2 步:应用程序对用户密码进行哈希处理,并使用该值作为对称密钥来加密/解密数据文件。例如"MyDifficultPassword" --> "HashedUserPwdAndKey"。
- 第 3 步:应用程序对第 2 步中的哈希值进行哈希处理,并将新值保存在数据文件头(即数据文件的未加密部分)中,并使用该值验证用户密码。例如"HashedUserPwdAndKey" --> "HashedValueForAuthentication"
基本上,我是从实现网站密码的常用方法(即当您不使用 OpenID 时)推断出来的,即将用户密码的(加盐)哈希存储在您的数据库中,并且从不保存实际密码。但是由于我使用散列用户密码作为对称加密密钥,所以我不能使用相同的值进行身份验证。所以我再次对其进行哈希处理,基本上将其视为另一个密码,并将双重哈希值保存在数据文件中。这样,我可以将文件带到另一台 PC 上,只需输入我的密码即可解密。
那么这个设计是相当安全的,还是天真的绝望的,还是介于两者之间?谢谢!
编辑:澄清和后续问题:盐。
我认为盐必须保密才能有用,但您的答案和链接暗示情况并非如此。例如,由 erickson 链接的this spec(如下)表示:
因此,此处定义的基于密码的密钥派生是密码、盐和迭代计数的函数,其中后两个量不需要保密。
这是否意味着我可以将盐值存储在与散列密钥相同的位置/文件中,并且仍然比在散列时完全不使用盐更安全?它是如何工作的?
更多背景信息:加密文件不打算与他人共享或解密,它实际上是单用户数据。但是我想将它部署在我无法完全控制的计算机上的共享环境中(例如在工作中),并且能够通过简单地复制文件来迁移/移动数据(这样我就可以在家中使用不同的工作站等)。
【问题讨论】:
标签: encryption cryptography passwords