Java安全学习笔记(八)-使用加盐技术防范字典式攻击

来源:互联网 发布:出租车计费软件 编辑:程序博客网 时间:2024/06/13 08:54
口令被轻松攻击的主要原因在于口令过短或者过于简单。如果口令很长,则计算所有组合的消息摘要可能要成百上千年,这将大大加大了生成字典的难度。同时口令过长也会给用户带来不便记忆的麻烦,因此用户使用的口令长度总是有限的。本实例将介绍如何使用加盐技术在有限的口令长度上防止字典式攻击。
使用加盐技术防范字典式攻击的技术要点如下:
账号口令初始化;
生成随机数(盐)
MessageDigest对象的应用;
在文件或数据库中保存账号和口令的消息摘要
package core;import java.io.FileOutputStream;import java.io.PrintWriter;import java.security.MessageDigest;import java.util.Random;/** * 使用加盐技术防范字典式攻击 * */public class Validate_Salt {public static void main(String[] args) throws Exception {//读入账号口令String user="msg";String passwd="pa";//生成盐Random rand=new Random();byte[] by=new byte[15];rand.nextBytes(by);//计算消息摘要MessageDigest md=MessageDigest.getInstance("MD5");md.update(by);md.update(passwd.getBytes("UTF8"));byte b[]=md.digest(); //计算消息摘要String result = "";for (int i = 0; i < b.length; i++) {result += Integer.toHexString((0x000000ff&b[i]) | 0xffffff00).substring(6);}//保存账号、盐和消息摘要PrintWriter out=new PrintWriter(new FileOutputStream("saft_password.txt"));out.println(user);for (int i = 0; i < by.length; i++) {out.print(by[i]+" ");}out.println();out.println(result);out.close();}}
 第一次运行结果

第二次运行结果

源程序解读
(1)由上面的结果可以看出每次使用的盐都会有不一样的消息摘要,即使攻击者得到saft_password.txt,如果还想以前那样生成字典,攻击,只能攻击8个字符长度的口令,如果用户口令长度超过8个,则字典将无效.
(2)执行MessageDigest类的静态方法getInstance()生成MessageDigest对象。其中传入的参数指定计算消息摘要所使用的算法。
(3)创建字节数组by。使用Java中random类生成随机数(盐),执行Random类的nextBytes()方法,方法的参数为by,即可生成随机数并将随机数赋值给by
(4)执行MessageDigest类的digest()方法进行计算,然后将账号、盐和口令消息摘要保存在saft_password.txt文件中。对于盐,这里将数组中各个byte值以数字保存在文件中,各个数字之间以空格隔开。