发表于: 2019-11-13 23:43:18
1 1193
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
1.实现md5加密
加盐:
盐(Salt)在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。
不明白?
详见:https://cloud.tencent.com/developer/article/1342756
2.md5加密
private static String md5Hex(String str){
try {
// 获取md5实例
MessageDigest md = MessageDigest.getInstance("MD5");
// md5加密后返回字节数组
byte[] digest = md.digest(str.getBytes());
// 通过Hex()类实现16进制字符串和字节数组的转换
return new String(new Hex().encode(digest));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
DigestUtils.md5Hex
方法可可替代上述代码
password = DigestUtils.md5Hex(password+salt);
2.2盐?在哪?
盐的要求是16位字符串 ,采用随机数方式
Random random = new Random();
StringBuilder stringBuilder = new StringBuilder(16);
stringBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));
System.out.println(stringBuilder);
int len = stringBuilder.length();
if(len<16){
for (int i=0;i<16-len;i++){
stringBuilder.append(0);
}
}
String salt = stringBuilder.toString();
2.3 有了盐(16位),加了密(32位),将盐和密整合
char[] chars = new char[48];
for(int i=0;i<48;i++){
chars[i] = password.charAt(i/3*2);
char c = salt.charAt(i/3);
chars[i++] = c;
chars[i++] = password.charAt(i/3*2+1);
}
List<String> list = new ArrayList<>();
list.add(salt);
list.add(new String(chars));
return list;
3.最终加密后的结果如何验证
用password + salt 看看和数据库中是否相等即可
public static Boolean verifyMD5(String password,String md5Str){
char[] cs1 = new char[32];
char[] cs2 = new char[16];
for(int i=0;i<48;i+=3){
cs1[i/3*2] = md5Str.charAt(i);
cs1[i/3*2+1] = md5Str.charAt(i+2);
cs2[i/3] = md5Str.charAt(i+1);
}
String salt = new String(cs2);
return DigestUtils.md5Hex(password+salt).equals(String.valueOf(cs1));
}
4.测试结果
public static void main(String[] args) {
String passSalt = passwordTest("a","1111222233334444");
System.out.println(passSalt);
System.out.println(md5Hex("a1111222233334444"));
System.out.println(verifyMD5("a","a13514616314e23e2d32222af32033f3373be49d4ea46644"));
}
可以正常加盐加密,也可以验证加密结果
明天计划的事情:
JWT
遇到的问题:
收获:
1.这个日报系统图片没法粘贴进来不是太多就是登录失效!!!!
评论