package jp.co.smile.common;
import java.io.IOException;
import java.security.*;
/***
* 作者:焦绪进
* 日期:20060804
* 说明:采用摘要算法,由于摘要算法不可逆,所以不容易破解
* 请使用encrypt()方法加密数据,该方法返回加密后的数据
* 然后将该数据存入数据库,字段长度至少>8 (尽量要长些)
* 方法checkDataSame()验证普通字符串是否与加密字符串“相等”
* 请自行删除“测试”的代码及方法
*/
public class PwdCheck {
/**
* 参数:String strPwd 参数为待加密的数据
* 功能:加密数据
* 说明:采用摘要算法,由于摘要算法不可逆,所以不容易破解
* */
public String encrypt(String strPwd) {
try {
//摘要算法SHA-1
java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
alga.update(strPwd.getBytes());
byte[] digesta=alga.digest();
return byte2hex(digesta);
} catch (java.security.NoSuchAlgorithmException ex) {
System.out.println("非法摘要算法");
return "加密出错";
}
}
/**
* 参数:strPwdDB 为从数据库取出来的已加密字符串
* 参数:strPwdInput 为从页面取来的用户输入的字符串
* 说明:两字符串相等返回true,否则返回false
* */
public boolean checkDataSame(String strPwdDB, String strPwdInput) {
try {
java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
algb.update(strPwdInput.getBytes());
String parameter2 = byte2hex(algb.digest());
//测试用
System.out.println("你刚才输入的密码已被加密成: " + parameter2);
//测试用
System.out.println("正在验证你输入的密码......");
if (strPwdDB.equals(parameter2)) {
return true;
} else {
return false;
}
} catch (java.security.NoSuchAlgorithmException ex) {
System.out.println("非法摘要算法");
return false;
}
}
/**
*二进制转字符串
*把二进制数组转换成十六进制串,用:号隔开
*一个字节(8位)对应于一个两位的十六进制数
*/
public String byte2hex(byte[] b) {
String hs="";
String stmp="";
for (int n=0;n<b.length;n++) {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}
/**
* 该方法为测试用
* */
public static void main(String[] args) {
byte[] yourInput = new byte[16];
PwdCheck my = new PwdCheck();
//请输入“这是被加密的数据”与“数据库”中的数据进行比较
String getDataFromDB = my.encrypt("这是被加密的数据");
System.out.println("从数据库取得的加密数据为: " + getDataFromDB);
System.out.println("请输入密码: ");
try {
System.in.read(yourInput, 0, 16);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("你刚才输入的密码是: " + new String(yourInput));
//验证密码的有效性
if (my.checkDataSame(getDataFromDB, new String(yourInput))) {
System.out.println("密码正确!");
} else {
System.out.println("你输入的密码不正确!");
}
}
}
import java.io.IOException;
import java.security.*;
/***
* 作者:焦绪进
* 日期:20060804
* 说明:采用摘要算法,由于摘要算法不可逆,所以不容易破解
* 请使用encrypt()方法加密数据,该方法返回加密后的数据
* 然后将该数据存入数据库,字段长度至少>8 (尽量要长些)
* 方法checkDataSame()验证普通字符串是否与加密字符串“相等”
* 请自行删除“测试”的代码及方法
*/
public class PwdCheck {
/**
* 参数:String strPwd 参数为待加密的数据
* 功能:加密数据
* 说明:采用摘要算法,由于摘要算法不可逆,所以不容易破解
* */
public String encrypt(String strPwd) {
try {
//摘要算法SHA-1
java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
alga.update(strPwd.getBytes());
byte[] digesta=alga.digest();
return byte2hex(digesta);
} catch (java.security.NoSuchAlgorithmException ex) {
System.out.println("非法摘要算法");
return "加密出错";
}
}
/**
* 参数:strPwdDB 为从数据库取出来的已加密字符串
* 参数:strPwdInput 为从页面取来的用户输入的字符串
* 说明:两字符串相等返回true,否则返回false
* */
public boolean checkDataSame(String strPwdDB, String strPwdInput) {
try {
java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
algb.update(strPwdInput.getBytes());
String parameter2 = byte2hex(algb.digest());
//测试用
System.out.println("你刚才输入的密码已被加密成: " + parameter2);
//测试用
System.out.println("正在验证你输入的密码......");
if (strPwdDB.equals(parameter2)) {
return true;
} else {
return false;
}
} catch (java.security.NoSuchAlgorithmException ex) {
System.out.println("非法摘要算法");
return false;
}
}
/**
*二进制转字符串
*把二进制数组转换成十六进制串,用:号隔开
*一个字节(8位)对应于一个两位的十六进制数
*/
public String byte2hex(byte[] b) {
String hs="";
String stmp="";
for (int n=0;n<b.length;n++) {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}
/**
* 该方法为测试用
* */
public static void main(String[] args) {
byte[] yourInput = new byte[16];
PwdCheck my = new PwdCheck();
//请输入“这是被加密的数据”与“数据库”中的数据进行比较
String getDataFromDB = my.encrypt("这是被加密的数据");
System.out.println("从数据库取得的加密数据为: " + getDataFromDB);
System.out.println("请输入密码: ");
try {
System.in.read(yourInput, 0, 16);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("你刚才输入的密码是: " + new String(yourInput));
//验证密码的有效性
if (my.checkDataSame(getDataFromDB, new String(yourInput))) {
System.out.println("密码正确!");
} else {
System.out.println("你输入的密码不正确!");
}
}
}