在数据安全里,加密加盐是什么意思

在数据安全里,加密加盐是什么意思

用户密码的历史

在网上看到一个说法,就是加密加盐是什么意思。

这要从很早开始说起,以前,登录账号密码是不加密的

用户登录的时候SQL里头大概是这么写的

select * from table where user='name' and pwd='password'

最早的网易邮箱,dedecms几乎都是这么写的,但是会暴露两个问题,一个是一旦数据泄露,账号密码在所有人眼里一目了然,不再有任何秘密。另一方面,这样的数据是明文的,任何一个程序员都可以看到,想象一下,如果有那么一个程序员,有歹心,特别是银行管理,会带来巨大的风险。

所以聪明的程序员就想到了加密,在注册的时候对密码加密,登陆的时候也加密对比不就好了。

但是加密又分为两种,对称性加密和非对称性加密,理论上,对称加密是可逆的,所以没什么意义,一旦数据泄露不也意味着逆向运算一下就可以了吗,早期确实由企业这么做,密码也确实被逆向了,非常不安全。大家都觉得非对称的更好,起码没法逆向不是?反正大家看不懂加密后的数据,只要无法逆推加密前的数据不就可以了吗。

大家都把眼光往非对称性加密走,其中有sha1,md5,严格来说sha1才是加密,md5不是

md5更多是用来验签的。

什么是验签

什么是验签,验签就是对对方发过来的数据做完整性验证,万一数据被人修改了怎么办?比方说我们在网上下载的游戏,压缩包,软件,中间被人修改了(历史上确实有过,现在依旧有),捆绑放入了广告,病毒等。所以为了验证这个数据包是官方发布的,官方在放出下载包的同时一般都会放出官方的md5验签字符串,这个字符串我们一般称之为签名。客户端下载数据包之后可以自行对数据包做验签,只要和官方的字符串一致,说明数据包没有被修改过。

md5的原理是什么?

md5即消息摘要算法第五版,前面当然有md2 md3 md4

所谓消息摘要,也就是md5认定的特征值,比方说,先将数据分成块,然后对抽取部分做散列运算,几个块运算完毕之后,再合并做运算,就是他所谓的特征值了,这样的特征值很难会有相同的,除非他们是一模一样的数据,这样就保证了签名一致性,或者说完整性。

php:
echo md5();

按理说md5足够使用了,但是在安全领域中仍然并不是足够安全的数据,因为即使是一层md5,理论上我把所有字符串都跑一遍md5,不就可以破解所有密码吗,还真有这种做法,这种做法是字典,将所有数据写成字典,这样一遍遍的试,总有可能破解的,为了提高这样的效率,又出了一个新的字典,专门针对md5的字典,叫做彩虹表,这里不作详细赘述,除此以外还有王小云教授的提高碰撞次数进行破解。

随着破解可能的提升,我们需要进一步额加密

手写原创,转载请声明https://ldlseo.com

考虑一个问题,假设我们的密码是123456,那么我加入一个字符串,123456ldlseo.com,用户输入123456的时候,并不是知道后面那串数字也是加入计算的,加入黑客就算获取破解了md5假面,获取到了123456ldlseo.com这个字符串,他怎么知道是123456作为密码还是123456ldl作为密码呢。与其说不行,倒不如说加大了甄别的难度,这种混淆就是加盐。

所以在注册的时候,除了密码字段意外,还会生成一段随机字符串,这段字符串就是盐值,我们会记录在数据库,每次用户登录,我们都会重新拼接传来的密码和盐值,再和本地数据库记录的加密后的密码对比

<?php
    $salt  = select salt  from table where user='name';
    $pwdandsalt = md5($password. $salt); 
    $pwdinSql = select pwd from table where user='name'
    if($pwdandsalt == pwdinSql  )
         ToDo
    else
        ToDo

这就是所谓的加盐了,当然了,实际上业界为了混淆难度加大,要做二次md5的,比方说这样

<?php
    echo md5(md5($password.$salt).$salt);

这就是加密加盐

手写原创,转载请声明https://ldlseo.com
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片