写点什么

用户密码验证函数

用户头像
叶鹏
关注
发布于: 2020 年 09 月 22 日

请用你熟悉的编程语言写一个用户密码验证函数,

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



用户头像

叶鹏

关注

还未添加个人签名 2018.09.25 加入

还未添加个人简介

评论

发布
暂无评论
用户密码验证函数