使用消息摘要验证口令
本实例介绍如何使用所保存的消息摘要验证用户输入的口令是否正确。若账号和口令都与保存在user_pass.txt中的相同,则提示“账号和口令都正确”,否则提示"错误的账号或口令"。不过这代码的逻辑总是有点奇葩哈哈。
使用消息摘要验证口令的技术要点如下:
1.读取文件中对应账号,口令的消息摘要
2.生成用户输入的口令的消息
3.将用户输入的口令的摘要和文件中保存的口令摘要进行对比。
package core;
import java.io.BufferedReader;
import java.io.FileReader;
import java.security.MessageDigest;
public class Validate_Mess {
public static void main(String[] args) throws Exception {
/* 读取文件中的账号和口令摘要 */
String user = "";
String passwd = "";
BufferedReader in = new BufferedReader(new FileReader("user_pass.txt"));
while ((user = in.readLine()) != null) {// 感觉挺奇葩的逻辑哈哈
passwd = in.readLine();
if (user.equals("msg")) {
break;
}
}
/* 生成用户输入的口令摘要 */
MessageDigest md = MessageDigest.getInstance("MD5");
md.update("pass".getBytes("UTF8"));// 模拟用户输入口令 ,同时把原密码口令pass转换成字节数组
byte b[] = md.digest();
String result = "";
for (int i = 0; i < b.length; i++) {
result += Integer.toHexString((0x000000ff & b[i]) | 0xffffff00).substring(6);
}
/* 检测口令摘要是否匹配 */
if (user.equals("msg") && result.equals(passwd)) {
System.out.println("账号和口令都正确");
} else {
System.out.println("错误的账号或口令");
}
in.close();
}
}
源程序解读
1.因为在user_pass.txt中,第一行保存的是账号,第二行保存的是账号对应的口令的消息摘要,所以以行地形式来读取用户账号对应的口令的消息摘要。
2.MessageDigest通过getInstance("MD5") 方法创建对象
3.MessageDigest的update方法中,传入的参数是字节类型或字节类型数组,对于字符串,需要先使用getBytes()方法生成字符串数组。
4.MessageDigest的digest()方法作用是计算消息摘要,计算的结果通过字节类型数组返回。
5. Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).substring(6) 作用是为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用:
byteVar & 0x000000FF的作用是,如果byteVar 是负数,则会清除前面24个零,正的byte整型不受影响。(...) | 0xFFFFFF00的作用是,如果byteVar 是正数,则置前24位为1,这样toHexString输出一个小于等于15的byte整型的十六进制时,倒数第二位为零且不会被丢弃,这样可以通过substring方法进行截取最后两位即可(一个字节从下标第6第7的位置的元素)。
6.最后比较用户输入的口令的消息摘要和文件中保存的口令摘要是否一致,当账号和口令摘要都与文件中保存一致时,则验证通过。