盐(Salt),在暗码学中,是指在散列之前将散列内容(例如:暗码)的恣意固定方位刺进特定的字符串。这个在散列中参加字符串的方法称为“加盐”。其作用是让加盐后的散列成果和没有加盐的成果不相同,在不同的运用情形中,这个处理能增加额定的安全性。 在大部分状况,盐是不需要保密的。盐可所以随机发生的字符串,其刺进的方位能够也是随意而定。假如这个散列成果在将来有必要进行验证(例如:验证用户输入的暗码),则需要将已运用的盐记录下来。
用户设置暗码 abc,假如数据库保存明文 abc,一旦走漏就等于走漏暗码,黑客就能够登录。
当黑客脱库没拿到明文 abc,只拿到了哈希值 900150983cd24fb0d6963f7d28e17f72,他们就要想办法知道哈希值对应哪个明文。所以他们就穷举出尽或许多字符串的哈希值,做成一个表,叫彩虹表。拿着表逐一去对,哈希值对上了就知道是哪个明文了。
为了避免彩虹表这种破解方法,所以就有了盐 salt,在摘要的时分加进去,比方 md5(a 盐 1b 盐 2c 盐 3),这样一来摘要输入变长了,简略的彩虹表就不够用了,得制造足够大的彩虹表去对,并且就算你对出来了你还要知道哪部分是盐哪部分是真实的暗码。
在增加新用户时,前端会向服务器发送用户名,暗码等表单信息,服务器在拿到用户的明文暗码后,生成一个或多个随机的字符串,也便是盐(salt), 再将这些盐和暗码通过hash算法加密,得到的密文存入数据库,salt也同时存入数据库,下次用户进行登陆时,将用户输入的明文和数据库中存储的salt再以相同的算法进行hash,得到暗码,然后和数据库中用户存储的正确的暗码的密文作比照,共同则暗码正确。
能够,可是不安全。假如盐是固定的,破解者也已得到了你的加密算法(能做到脱库,取到你的源代码也或许吧),盐也现已被知道了(盐要不放在源代码里固定的字符串,要不存在数据库),这样一来,就和没加密没区别了,只需进行撞库就行了,一切的暗码都被破解了;假如盐是随机的,每个人的盐都不一样,就算知道了加密算法和盐,要破解一切的暗码,那就得针对每个用户都去建一个彩虹表(由于盐不一样),那复杂度可就高多了。