在数据库中存储密码时使用Salt,以防止字典攻击和彩虹表。
但是,我们假设我们需要存储有关用户的唯一且随机(敏感)的信息。在对这些信息进行哈希处理之前,还有一个优势吗?
在这种情况下,不会使用盐,只是为已经随机的数据添加随机性(与人工密码不同)?
这在很大程度上取决于搜索空间的大小。例如,我们可以假装社会安全号码是随机的和唯一的(它们实际上也不是,但为了讨论的目的,我们将假装它们)。如果你正在散列SSN,你不仅需要盐,还有盐是不够的。为什么?因为存在少于100亿个SSN。为这些创建彩虹表是微不足道的。即使使用盐,即使价值是独特且随机的,也不难以暴力。
因此,为了保护存在于小型搜索空间中的随机和唯一值,我们必须使用像PBKDF2这样的拉伸算法,而不仅仅是哈希。拉伸算法的要点是使哈希计算非常慢。
拉伸算法总是包含盐。但它不一定是随机盐。它可以是确定性的(例如,某些数据库标识符+用户ID,“com.example.mygreatapp:alice”)。但是对于小型搜索空间,您仍然需要每个用户都是唯一的,因为搜索空间中的项目很少。
另一方面,如果您的随机和唯一数据代表一个大的搜索空间(不小于2 ^ 64,理想情况下至少为2 ^ 80),并且搜索空间稀疏(您只使用一小部分合法元素) ),然后可能不需要盐腌和拉伸。