1         背景

涉及身份验证的系统都需要存储用户的认证信息,常用的用户认证方式主要为用户名和密码的方式,为了安全起见,用户输入的密码需要保存为密文形式,可采用已公开的不可逆的hash加密算法,比如SHA256, SHA512, SHA3等,对于同一密码,同一加密算法会产生相同的hash值,这样,当用户进行身份验证时,也可对用户输入的明文密码应用相同的hash加密算法,得出一个hash值,然后使用该hash值和之前存储好的密文值进行对照,如果两个值相同,则密码认证成功,否则密码认证失败。

由于密码是由用户设定的,在实际应用中,用户设置的密码复杂度可能不够高,同时不同的用户极有可能会使用相同的密码,那么这些用户对应的密文也会相同,这样,当存储用户密码的数据库泄露后,攻击者会很容易便能找到相同密码的用户,从而也降低了破解密码的难度,因此,在对用户密码进行加密时,需要考虑对密码进行掩饰,即使是相同的密码,也应该要保存为不同的密文,即使用户输入的是弱密码,也需要考虑进行增强,从而增加密码被攻破的难度,而使用带盐的加密hash值便能满足该需求。

2         加密盐的实现方法

2.1        加密存储

输入: 密码字符串passWord

输出:盐值 salt 、密码密文passWordHash

函数:加密hash函数

其中:“盐值 salt”是在加密过程中生成的随机字符串;

可以将salt放到passWord前面作为前缀或放到passWord后面作为后缀得到新的字符串PS,即,PS = password和salt的组合串;

密码密文passWordHash = Hash加密函数(PS );

将用户名、密码密文passWordHash和盐值salt一起保存到数据库中。

2.2        密码校验

输入: 密码字符串passWordCur

输出:密码校验是否成功

处理: 1)、取出当前用户密码加密时使用的盐值salt

2)、得到本次输入的密码passWordCur和盐值salt的组合字符串PS

3)、得出本次输入密码的密文passWordHashCur= Hash加密函数(PS );

4)、比较passWordHashCur和用户最初设置的密码密文passWordHash是否一致,如果一致,则校验成功,否则校验失败。

3         常用的密码攻击方式

常用的密码攻击方式有字典攻击、暴力破解、查表法、反向查表法、彩虹表等。

对字典攻击和暴力破解,攻击者均采用逐密码尝试的方式,目前没有很好的手段来阻止字典攻击和暴力破解攻击,只能是想办法让这两种攻击方式变得相对低效一些,而相同的密码产生不同的hash值便能让攻击者针对每一个hash值都需要从头进行尝试,从而使攻击变得更加低效。

对查表法、反向查表法和彩虹表攻击方式,攻击者需要提前准备好包含密码和密码hash值的密码表,然后根据该表和用户密码数据库进行批量匹配,从而达到攻破密码的目的;而如果我们在加密时,给每个密码附加了不同的随机值,这样每个密码对应的hash值也会不同,这样攻击者在准备密码表时,就必须要将最基本的密码和用户密码数据库中的盐值进行笛卡尔积后再计算hash值,盐值越多,用户需要准备的表量越大,这样对于攻击而言,就变得有些得不偿失了。

4         加盐的注意事项

加盐的目的是为了增加攻击者破解的难度,那么在加盐的时候要注意以下几点,否则加盐的意义也不会太大。

1)、盐值不能太短;如果盐值只有少数两三位甚至一两位的话,攻击者完全可以穷举所有可能的盐值;关于盐值长度的一个经验值是长度至少要和hash加密函数的返回值长度保持一致。

2)、盐值不能固定;如果系统使用了固定的盐值,那么和不加盐相当于是一回事了,攻击者完全可以使用该固定的盐值提前准备密码表;另外,相同密码对应的hash值仍然是一样的,仍然无法对密码相同这一事实进行掩饰。

3)、不要使用能提前预知的值作为盐值;如果盐值能提前得知或提前推断出,攻击者也完全可以根据提前预知的盐值准备密码表,从而对破解的难度也增加不了多少。

4)、每一次修改密码重新计算hash值时,要重新生成新的盐值,不要使用上次密码对应的盐值;因为如果用户密码泄露之后,盐值相应的也就泄露了,用户修改密码时,如果还沿用原来的盐值,攻击者也仍然可以根据上次的盐值提前准备密码表,从而使攻破可能性变得更高了。

php登录加密加盐的更多相关文章

  1. MD5加密+加盐

    了解: MD5加密,是属于不可逆的.我们知道正常使用MD5加密技术,同一字符,加密后的16进制数是不变的,自从出现彩虹表,对于公司内部员工来说,可以反查数据,获取不可能的权限,所以出现了salt算法. ...

  2. Python学习笔记(七)加密加盐

    MD5加密和加盐 Python的MD5加密 Python的hashlib模块的MD5加密,是比较简单一种加密,md5函数必须传入编译后的结果,否则会报错: Traceback (most recent ...

  3. MD5加密加盐

    Java实现MD5的随机加盐加密,这样以来就很难解密了,必须使用原密码才能正常的登录系统了,以下为Java实现的MD5随机加盐加密,以及使用Apache的Hex类实现Hex(16进制字符串和)和字节数 ...

  4. 模块 -- 序列化 hashlib sha logging (加密 加盐 )

    模块:  一个py文件就是一个模块 模块分类: 1:内置模块,登录模块,时间模块,sys模块,os模块等等 2: 扩展模块, 3:自定义模块,自己写的py文件 python 开发效率之高:python ...

  5. MD5加密以及验证加密-加盐

    加密与解密算法: /// <summary> /// 签名字符串 32位 /// </summary> /// <param name="input" ...

  6. md5,md2加密加盐

    数组是没有重写object的toString()方法.byte[].toString()

  7. 【koa2】用户注册、登录校验与加盐加密

    加密与解密 先介绍一下关于服务端用户名跟密码的存储状态,我们知道当前端在注册一个新用户时,会在表单内填入用户名和密码,并通过post请求提交到服务器,服务器再把用户名和密码从ctx.request.b ...

  8. 一种简单的md5加盐加密的方法(防止彩虹表撞库)

    md5加密(或者说摘要算法)大家都很熟悉了 就不解释了 现在很多数据库设计都喜欢用单向加密的方式保存密码,验证时对提交的密码再次加密之后做密文对比 /// <summary> 使用MD5加 ...

  9. 加盐加密salt

    加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联. 加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“( ...

随机推荐

  1. python异常之ModuleNotFoundError: No module named 'test01inner02'

    当我们使用sys.path.append(args) 指令向程序中导入模块时其实本次append操作只是在内存中完成的,如果要永久性的添加需要修改环境变量. 我们发现当我们使用print(sys.pa ...

  2. ZROI #365. 【2018普转提day18专题】嘤嘤嘤嘤

    ZROI #365. [2018普转提day18专题]嘤嘤嘤嘤 直接放代码 具体做法见注释 #include<stdio.h> #include<cstring> #inclu ...

  3. Linux —— 常用命令集合

    关机和重启命令 shutdown [选项] 时间 (添加&,把关机任务放在后台执行) 只有shutdown可以保存关机时资源 操作选项 重启: r 关机: h 取消一个关机任务: c 关机命令 ...

  4. java中代码执行顺序

    静态代码块 -- >构造代码块 --> 构造方法静态代码块:只执行一次构造代码块:每次调用构造方法都执行 http://blog.csdn.net/wuhaiwei002/article/ ...

  5. MFC中的模态对话框与非模态对话框

    模态对话框创建: MyDialog mydlg; mydlg.DoModal() 当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行. 模态对话框的关闭顺序: OnCl ...

  6. Jmeter----小技巧(3)

    1.关闭启动Jmeter时出现的面板 说明:启动Jmeter的同时往往会打开一个下图所示的面板,经常不小心关掉后,导致Jmeter停止运行,偶尔写了好久的脚本没来得及保存就没了,烦恼不已 怎样避免如上 ...

  7. 《javascript设计模式》笔记之第七章:工厂模式

    在读了这章之后,根据我个人现在的理解,工厂模式就是:将一个类或者一个方法称为一个工厂,然后再将一些模块交给这个工厂,让这个工厂按照给它的不同模块产出不同的实例. 下面为正文: 一:简单工厂: 例子: ...

  8. Android studio 断点调试

          最近进行业务测试,总是被测试环境不稳定或者测试数据错误困扰,一有问题就去找开发,自己都觉得很烦,所以就自己学着调试起来,这样以后遇到问题就可以自己定位的更深入了.   1.确保连接设备且进 ...

  9. 基于.net core封装的xml序列化,反序列化操作

    需求: 由于在.net core中去除了Xml序列化XmlSerializer操作类.因此,在于一此数据传输当中出,需要用到对xml格式字符串的处理问题.因此封装了一个xml序列化与反序列化操作的类库 ...

  10. java面试题(基础部分)

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...