我是新手,所以这个问题很简单。我只是不太了解腌制。
如果没有salting和sha1,您可以将密码哈希为sha1('password')并验证用户只需比较sha1_stored ==? SHA1(USER_INPUT)。
使用salting和sha1,您将密码哈希为sha1('password'+ salt),但我不确定如何验证它。
根据我所读到的,盐总是随机的。所以,如果你sha1('password'+ random_salt1),你是否必须将random_salt存储在某处,因为当你验证sha1('password'+ random_salt1)==? sha1(user_input + random_salt2),你不能保证random_salt1 == random_salt2。或者盐就像一个site_key(随机盐,但整个网站只存储一个)?我知道盐会增加安全性,但我不确定如何正确实现它,以便我可以验证我存储的内容(也不知道这一点)。那么有人可以向我解释这个并且可能给我一个盐析和验证字符串的例子吗?
答案 0 :(得分:2)
是的,你必须在某处储存随机盐。
不,你不应该对整个网站都一样,因为它完全违背了腌制的目的。
腌制的目的是提高整个密码列表的安全性。如果您不加盐,并且数据库被破坏,攻击者将获取您的所有帐户和密码。如果它们没有被腌制,那么攻击者只需要一堆语言并将所有这些与所有sha1密码进行比较。其中一些会匹配一些密码,而且有些帐户会受到损害。
使用salting,攻击者必须独立操作每个密码,从整个词典开始,对它们进行盐化,对它们进行哈希处理,然后将它们各自与盐渍,哈希密码进行比较。您可以看到这样效率会低得多,因为攻击者每次都必须更换盐。通过这种方式,从受感染的数据库中获取密码要困难得多。
存储salt的一种常用方法是将其附加或预先添加到哈希并将其存储在数据库中。由于salt和hash具有已知的长度,因此很容易将它们独立地拉出来。
答案 1 :(得分:1)
盐是随机选择的,每个字符串都不同,但这并不是秘密。因此,您将盐与哈希值salt + hash
一起存储。验证检查hash(salt + password)
是否等于存储的哈希。
使用salt的主要目的是确保两个相同的密码不会散列到同一个东西,并且还更难以对散列密码进行攻击。如果没有salt,你只需要打破一个给定的哈希一劳永逸来识别散列到它的所有密码。使用salt,你基本上必须重新攻击每个哈希值。
请注意,在廉价并行计算硬件(GPU和云)的现代,单个盐渍哈希不再是那么安全,因为它可能在可行的时间内通过强力发现。因此,当前的建议是多次散列密码(如1000轮左右)以使计算成本高昂。当提供正确的密码时,额外的时间无关紧要,但如果你试图暴力,那么增加1000倍就是一个重要的威慑力。