发表于: 2017-05-05 22:32:11
1 1206
今天完成的事情:
使用md5对用户登录和注册进行加密,定义token,放入cookie中
然后判断token是否有效来判断登录是否成功
我把md5和加盐写在了一个工具类里面
public class MD5Util {
public static String stringToMD5(String string) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e){
e.printStackTrace();
}
//计算md5函数
md.update(string.getBytes());
//digest()最后确定返回md5 hash值
//Biginteger函数则将8位的字符串转换成16位的hex值,用字符串表示;得到字符串形式的hash值
return new BigInteger(1,md.digest()).toString(16);
}
public static String gengerate(String password) {
Random r = new Random();
StringBuilder sb = new StringBuilder(16);
sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
int len = sb.length();
if (len<16) {
for (int i = 0;i<16-len;i++){
sb.append("0");
}
}
String salt = sb.toString();
password = md5Hex(password+salt);
char[] cs =new char[48];
for (int i = 0;i<48;i+=3) {
cs[i] = password.charAt(i/3*2);
char c = salt.charAt(i/3);
cs[i+1] = c;
cs[i+2] =password.charAt(i/3*2+1);
}
return new String(cs);
}
public static boolean verify(String password,String md5) {
char[] cs1 = new char[32];
char[] cs2 = new char[16];
for (int i = 0;i<48;i+=3) {
cs1[i/3*2] = md5.charAt(i);
cs1[i/3*2+1] = md5.charAt(i+2);
cs2[i/3] = md5.charAt(i+1);
}
String salt = new String(cs2);
return md5Hex(password+salt).equals(new String(cs1));
}
private static String md5Hex(String src) {
try {
MessageDigest md5 = MessageDigest.getInstance("md5");
byte[] bs = md5.digest(src.getBytes());
return new String(new Hex().encode(bs));
}catch (Exception e){
return null;
}
}
}
明天计划的事情:
修改Task4中的两个页面,一个设为用户不登录可以访问,一个设为用户必须登录才可以访问。要求用户必须登录才能访问的url统一增加前缀 /u/。
结束任务五
遇到的问题:
在注册用户的时候加盐都是可以的,但是在加盐后一直登录无效
收获:
理解了加盐的含义:
加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联。无论何时只要口令改变,随机数就改变。随机数以未加密的方式存放在口令文件中,这样每个人都可以读。不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中。
不过我暂时还没有领悟到加盐的好处...也许是我接触的还不够多吧.....
评论