【密码学】轻松理解“加盐”的原理与java实现 |
您所在的位置:网站首页 › 高汤为什么不加盐 › 【密码学】轻松理解“加盐”的原理与java实现 |
上一篇博客中说到防御彩虹表攻击最常用的方法就是加盐,那么什么是加盐呢? 一、什么是加盐? 1.背景现在很多公司后台以hash值形式存储用户密码(虽然本文以MD5哈希函数为例,但becrypt函数最常用的),用于哈希函数存在碰撞的特性,当后台数据库被攻击然后获取到用户密码哈希值时,还是能通过一定的方法(比如彩虹表攻击)破解用户密码。 举个例子:http://www.cmd5.com/ 能破解。 2.加盐原理简介简单来说:由原来的H(p)变成了H(p+salt),相当于哈希函数H发生了变化,每次哈希计算使用的salt是随机的 H如果发生了改变,则已有的彩虹表数据就完全无法使用,必须针对特定的H重新生成,这样就提高了破解的难度。 二、如何加盐?如何加盐,不同的哈希算法不同的公司不尽相同但思路都是差不多的。本文以MD5的一个简单加盐处理为例,讲解加盐的java实现: 1.生成盐 private static char[] hex = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; /** *自定义简单生成盐,是一个随机生成的长度为16的字符串,每一个字符是随机的十六进制字符 */ public static String salt() { Random random = new Random(); StringBuilder sb = new StringBuilder(16); for (int i = 0; i < sb.capacity(); i++) { sb.append(hex[random.nextInt(16)]); } return sb.toString(); }这只是一个生成盐的想法而已,你可以按自己的想法来,只要保证每次执行生成的盐随机即可。 2.输入加盐 String inputWithSalt = inputStr + salt;//加盐,输入加盐加盐非常简单吧 3.输出带盐输出带盐是我自己取的一个名字而已,这个过程可选不要。实际上是将这次哈希计算过程用到的salt存储到这次hash值中,用于后面进行验证密码时进行hash计算,即注册存储密码时和登陆验证密码时用到的salt要一样,免除了另存hash操作。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |