用户密码验证函数
请用你熟悉的编程语言写一个用户密码验证函数,
Boolean checkPW ( String用户ID, String密码明文,String密码密文)
返回密码是否正确boolean值,密码加密算法使用你认为合适的加密算法
为了保护网站的敏感数据,应用需要对这些信息进行加密处理,信息加密技术可分为三类:单项散列加密,对称加密,非对称加密。
用户注册和登录时序图见下:
MAC 是密钥相关的 哈希运算消息认证码(Hash-based Message Authentication Code),HMAC 运算利用 哈希算法 (MD5、SHA1 等),以 一个密钥 和 一个消息 为输入,生成一个 消息摘要 作为输出。
HMAC 发送方 和 接收方 都有的 key 进行计算,而没有这把 key 的第三方,则是 无法计算出正确的 散列值的,这样就可以 防止数据被篡改。
同时考虑将用户ID加入密码中进行加密。
package password;
import java.io.UnsupportedEncodingException;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class test {
public test() {
// TODO Auto-generated constructor stub
}
private static final String KEY_MAC = "HmacMD5";
/**
* 密码校验
*
* @param userId
* 用户id
* @param passwordStr
* 密码明文
* @param encryptPassword
* 加密后密码
* @return
* @throws UnsupportedEncodingException
*/
public static boolean checkPW(String userId, String passwordStr, String encryptPassword) {
/*
* 加密方式: (用户ID+原密码)根据加密的key加密一次
*/
String data = new StringBuilder(userId).append(passwordStr). toString();
String key = "checkPW";// TODO 加密的key
try {
byte[] databytes = data.getBytes("UTF-8");
SecretKey secretKey = new SecretKeySpec(key.getBytes("UTF-8"), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
byte[] passwordbytes = mac.doFinal(databytes);
String strpassword = new String(passwordbytes,"UTF-8");
System.out.println(strpassword.getBytes("UTF-8"));
if (strpassword.equals(encryptPassword)) {
return true;
} else {
return false;
}
} catch (Exception e) {
System.out.println("create hmac helper failed.");
return false;
}
}
public static void main(String[] args) {
checkPW("qq123456", "qq689934", "fdfdf");
}
}
参考:
https://xie.infoq.cn/article/92582e60315eb75a5d581a179
评论