据我了解,生成盐的最佳做法是使用源代码中存储的一些神秘公式(甚至魔术常量).
我正在研究一个我们打算作为开源发布的项目,但问题是源代码是生成盐的秘密公式,因此能够在我们的网站上运行彩虹表攻击.
我认为很多人在我面前都考虑过这个问题,我想知道最佳做法是什么.在我看来,如果代码是开源的话,根本就没有盐,因为盐可以很容易地进行逆向工程.
思考?
假设您可以自由决定如何将散列密码存储在DBMS中.像这样的计划有明显的弱点吗?
要创建存储在DBMS中的哈希值,请执行以下操作:
这意味着任何想要发生冲突的人都必须分别为每个用户名和每个DBMS服务器实例单独完成工作.我打算保持实际的哈希机制有点灵活,以允许使用仍在使用的新NIST标准哈希算法(SHA-3).
"DBMS服务器实例独有的值"不一定是秘密的 - 尽管它不会随便泄露.目的是确保如果有人在不同的DBMS服务器实例中使用相同的密码,则记录的哈希值会有所不同.同样,用户名也不是秘密 - 只需要密码.
首先使用密码以及用户名和"唯一值"第二个,或三个数据源的任何其他排列是否有任何优势?或者交错字符串怎么样?
我是否需要添加(并记录)随机盐值(每个密码)以及上述信息?(优点:用户可以重新使用密码,但仍然可能会在数据库中记录不同的哈希值.缺点:必须记录盐.我怀疑其优势远大于缺点.)
有很多相关的SO问题 - 这个列表不太可能是全面的:
我认为这些问题的答案支持我的算法(尽管如果你只是使用随机盐,那么'每个服务器的唯一值'和用户名组件就不那么重要了).
我已经阅读了几个关于这个主题的stackoverflow帖子,特别是这个:
但是我还有几个问题,我需要澄清一下,如果以下陈述属实,请告诉我并解释你的意见:
如果有人可以访问您的数据库/数据,那么他们仍然需要弄清楚您的哈希算法,并且您的数据仍然会有些安全,具体取决于您的算法?他们所拥有的就是哈希和盐.
如果有人可以访问您的数据库/数据和源代码,那么无论您做什么,您的哈希算法都可以进行逆向设计,您唯一能做的就是算法的复杂性和时间性.是什么?
似乎最薄弱的环节是:您自己的系统有多安全,谁有权访问它?
Lasse V. Karlsen ......提出了一个很好的观点,如果你的数据受到损害,那么游戏结束......我的后续问题是:这些哈希试图防范什么类型的攻击?我读过关于彩虹表和字典攻击(蛮力),但这些攻击是如何进行的?
encryption ×3
security ×3
hash ×2
salt ×2
cryptography ×1
open-source ×1
passwords ×1
rainbowtable ×1