Java 使用加盐技术防范字典式攻击

概要:

口令被轻松攻击的主要原因在于口令过短。如果口令很长,则计算所有组合的消息摘要可能要成百上千年,这将大大加大了生成字典的难度。同时口令过长也给用户带来了不便记忆的麻烦,因此用户使用的口令长度总是有限的。本实例将介绍如何使用加盐技术在有限的口令长度上防止字典式攻击。

| |目录

技术要点

使用加盐技术防范字典式攻击的技术要点如下:

  • 账号口令初始化。

  • 生成随机数(盐)。

  • MessageDigest对象的应用。

  • 在文件或数据库中保存账号和口令的消息摘要。

代码实现

package net.xsoftlab.baike;
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 = "yjp";
		String passwd = "nql";
		// 生成盐
		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文件,如果还像以前那样生成字典,即使计算出1~20个字符长度的所有字符组合,也只能攻击8个字符长度的口令,如果用户口令长度超过8个,则字典将无效。而如果不预先生成字典进行攻击,则攻击者每次都必须先取出saft-passwdsalt.txt文件中口令的盐的值,然后重复进行“组串—生成字典—匹配”的计算,而不是只需要计算一次。这样,如果一次计算需要耗时半年,而用户不到半年如一个月就修改一次口令,则攻击者将无法得逞。

  2. 执行MessageDigest类的静态方法getInstance()生成MessageDigest对象。其中传入的参数指定计算消息摘要所使用的算法。

  3. 创建字节数组by。使用Java中Random类生成随机数(盐),执行Random类的nextBytes()方法,方法的参数为by,即可生成随机数并将随机数赋值给by。

  4. 执行MessageDigest类的digest()方法进行计算,然后将账号、盐和口令消息摘要报存在saft_password.txt文件中。对于盐,这里将数组中各个byte值以数字保存在文件中,各个数字之间以空格隔开。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消