我已经阅读了SO上许多关于此问题的问题,但是许多答案互相矛盾或者我不能理解。
您应该始终将密码存储为哈希值,而不是明文。但是,您是否应该在数据库中将盐(每个用户唯一的)存储在哈希密码+盐旁边?对我来说,这似乎不太聪明,因为某人可以获取对数据库的访问权,查找所谓的管理员账户等,然后从中推断出密码。
hash = md5(password)
和 hash = sha1(password)
的表格很常见。output = f(input)
形式的哈希函数生成。例如,如果您对所有用户密码使用一个网站范围的salt,例如 hash = md5(salt+password)
,则可以构造一个函数 f
,f(password) = md5(salt+password)
。因此,您可以为此函数生成彩虹表,这需要很长时间,但然后会让您非常快速地破解数据库中的每个密码。hash = hashfunction(salt + password)
hash = hashfunction(salt + password + user_id)
hash = hashfunction(global_salt + user_salt + password)
将盐值与用户数据一起存储并不会削弱哈希的安全性。哈希函数是单向的:即使对于一个未加盐的密码,给定其哈希值,也很难找到该密码。加盐的动机不是为了使单个哈希更安全,而是为了使多个哈希的集合更安全。针对未加盐哈希值集合的攻击有以下几种途径:
123
、password
、god
)进行哈希,并查看数据库中是否存在这些密码,然后破解这些账户$hashed_password = sha1($user_password . $user_salt . $static_salt);
$user_salt
是数据库中每个用户唯一的盐值,$static_salt
是在代码设置中指定的盐值。
这是我的理解。
好吧...虽然不完全完整,但我的观点是坏人需要很长时间....但是好人总是比坏人领先一步,以确保他们知道坏人将用于破解的技术。所以只需随着时间的推移设计更好的技术。
保重....