写点什么

架构训练营第十一周作业

用户头像
张锐
关注
发布于: 2020 年 08 月 26 日

请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文)返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。



import sun.security.provider.MD5;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author ray.zhangr
* @date 2020/8/26 1:47 下午
*/
public class TestPasswd {
/**
* 模拟用户提交登陆密码校验
* 明文密码在网络中传输使用https
* 如果使用http需要自己实现加密传输
* @param userId
* @param password
* @param passwdEncrypt
* @return
*/
private static Boolean checkPW(String userId, String password, String passwdEncrypt) {
String salt = userId;
String passwdVerify = Md5Util.md5(userId + password);
return passwdVerify.equals(passwdEncrypt);
}
public static void main(String args[]) {
// String passwdEncrypt = Md5Util.md5("64359" + "HappyGeekTime");
System.out.println(checkPW("64359", "HappyGeekTime", "70970617f196ec4102cc396db5b06bcf"));
}
}
/**
* MD5工具类
* 转自https://www.cnblogs.com/huxiaoguang/articles/10809750.html
*/
class Md5Util {
public static String md5(String buffer)
{
String string = null;
char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
md.update(buffer.getBytes());
byte[] datas = md.digest(); //16个字节的长整数
char[] str = new char[2*16];
int k = 0;
for(int i=0;i<16;i++)
{
byte b = datas[i];
str[k++] = hexDigist[b>>>4 & 0xf];//高4位
str[k++] = hexDigist[b & 0xf];//低4位
}
string = new String(str);
} catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
return string;
}
}

MD5工具类如果在项目中可以使用spring等工具自带。加密算法使用的salt用userId,整体加密串为userId+password,在实际应用中使用更为复杂的加盐逻辑,比如用户的注册时间、用户注册时的设备信息等这些平常无法猜测的信息。这样的目的在于像智慧老师上课讲的,如果密文被拖库窃取,黑客已有的明文密文映射表里面依然查不到我们这种特殊加盐的散列密码,就不会反向知道明文。

另外明文密码在网络中传输一般是系统不允许的,要不使用https,要不系统实现 用户提交内容对称加密(密钥由服务器分发)+密钥本身再非对称加密方式传输通讯。

用户头像

张锐

关注

还未添加个人签名 2018.08.07 加入

还未添加个人简介

评论

发布
暂无评论
架构训练营第十一周作业