【发布时间】:2019-08-01 00:22:46
【问题描述】:
我遇到了以下问题: 在 Java 应用程序中,我想将一些配置数据存储在加密的本地文件中。此文件可能用于机密数据,例如用户凭据。
该文件应该可以通过使用密码(并且只能使用密码)访问。 现在大多数值得信赖的人和参考实现都使用随机盐。我完全理解这是一个合理的选择。但是,如果我的应用程序终止并稍后启动,则随机盐不再可用。此应用程序是独立的,因此不能将额外的数据库用作盐存储。
对于我的软件,用户只需输入密码(意味着:没有用户名、没有盐、没有最喜欢的动物或颜色)。
现在我的想法是从密码中提取盐值(例如,通过使用 SHA-256 的前 16 个字节)。
我的问题是:
- 此实施的安全性如何?
- 什么是仅使用密码加密内容的常用方法,并且是更好的选择?
这个问题的目的不是什么:
- 盐的存放地点
- 安全算法和加密实现(当然,加密不是我自己实现的)
- 架构改进(不,我不想要一个全局数据库来存储东西)
【问题讨论】:
-
通常在每次应用启动时都不会随机生成一个盐值,它们大多是硬编码的。
-
得到了一篇由专家撰写的文章(不幸的是只有德语),上面写着“开发人员应为每次使用随机创建盐,以避免彩虹表攻击。与将盐与密码哈希一起存储在用户数据库、硬编码的常量盐可以通过反编译轻松读取。” (heise.de/developer/artikel/…)
-
盐用于散列,而不是加密。
-
盐用于单向哈希,而不是双向加密。通过从密码中提取盐,您不一定会使事情变得更糟,但也不会使它们更安全。例如,它不能防止彩虹表攻击。我做 发现有点担心的是你想出了你自己的加密方案。如果我是你,我会找到一个加密库并阅读它的文档以了解如何有效地使用它。
-
@f1sh "通常情况下,每次应用程序启动时都不会随机生成 salt 值,它们大多是硬编码的。" - 不要这样做。这破坏了加盐的全部意义。对于每个密码,应该生成一个单独的盐。
标签: security encryption salt