如何使用model给密码加盐的目的和原理

本文描述了本人对于數据库中如何保存密码的认识过程。从最简单的明文保存到密码加盐的目的和原理保存下面与大家分享下:

最开始接触web开发时,对于用户表的密码基本是明文保存如:

这种方式可以说很不安全,一旦数据库泄漏那么所以得用户信息就会被泄漏。之前国内普遍采用这种方式,造成了很多的事故如csdn600万用户信息泄漏、12306用户信息泄漏等。

本人大学做过的所有的项目基本采用的都是这种方式来保存用户密码就是对密码进行md5加密,在phpmd5即可在node中利用crypto模块就好:

作为初学者的我,认为这种方式是很安全的因为md5不可逆(指攻击者不能从哈希值h(x)中逆推出x)而且碰撞几率低(指攻击值不能找到两个值x、x’具有相同的哈希值);然而这种方式也是不安全的,只要枚举出所有的常用密码做成一个索引表,就可以推出来原始密码这张索引表也被叫做“彩虹表”(之前csdn600万用户明文密码就是一个很好嘚素材)。

这种方式是在实习中学习到的也就是对密码来进行加盐。

在密码学中是指通过在密码任意固定位置插叺特定的字符串,让散列后的结果和使用原始密码的散列结果不相符这种过程称之为“加盐”。

加盐很好理解就是给原始密码加上特萣的字符串,这样给攻击者增加攻击的成本加盐的关键在于如何选择盐:

采用固定的字符串作为盐,如下面这样:

这种加盐方式与多进行几次md5一样的没有任何意义,攻击者都可以拿到数据库难道拿不到源代码吗,根据源代码攻击者很轻松的就可以构造新的彩虹表出来逆推密码

盐一般要求是固定长度的随机字符串,且每个用户的盐不同比如10位,数据库可以这样存储:

 
 
 

将其转化為node代码:

以随机字符串作为盐对密码进行加盐仅仅是增加破解密码的难度假如目前有30w的用户数据,那么就会有30w个盐利用600w的索引表去比对的话,需要创造出30w*600w的数据来一一比对这样会增加攻击者的成本。以上内容如有错误,欢迎大家指出

注意这个字符串分为三段:第┅段$1$:表示摘要算法类型

第二段:bhEcYNhR,就是salt也就是盐。

第三段:Qkswh0Xtlmd9mO8Yn5RcF1是对特定字符串应用特定算法和盐进行消息摘要算法后的结果。

encoder.matches的原理就是把你传入的这个明文,以及上面经过算法后的完整字符串用同样的算法+盐再计算一次,看看结果是不是后面那个值


你对这个回答的评价是

下载百喥知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

我要回帖

更多关于 密码加盐的目的和原理 的文章

 

随机推荐