【密码学】轻松理解“加盐”的原理与java实现

您所在的位置:网站首页 高汤为什么不加盐 【密码学】轻松理解“加盐”的原理与java实现

【密码学】轻松理解“加盐”的原理与java实现

#【密码学】轻松理解“加盐”的原理与java实现| 来源: 网络整理| 查看: 265

        上一篇博客中说到防御彩虹表攻击最常用的方法就是加盐,那么什么是加盐呢?

一、什么是加盐? 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