发表于: 2017-11-14 21:30:49
1 669
今天完成的任务
先定一个小目标
做出md5加盐出来,数据库内储存加盐后的账号密码和盐
https://blog.coderzh.com/2016/01/10/a-password-security-design-example/
https://blog.coderzh.com/2016/01/03/security-design/
参考这两篇文章 首先做出MD5(MD5(password)+盐)
本来盐打算随机生成,但是不知道怎么在java程序内的
generateSeed(1);
和获取到mysq上的
generateSeed(1);
一直不一样,百度也找不到原因,我认输,等师兄解答一下吧
---------------------------------------------------------------------------
认输后的产物
public class AppMD5Util {
final static String USERKEY ="123456";
/**
* 对字符串md5加密(小写+字母)
*
* @param str 传入要加密的字符串
* @return MD5加密后的字符串
*/
public static String MD5(String str) {
try {
// 生成一个MD5加密计算摘要
MessageDigest md = MessageDigest.getInstance("MD5");//返回实现指定摘要算法的 MessageDigest 对象。
// 计算md5函数
md.update(str.getBytes());
//update使用指定的byte更新摘要
//getBytes函数是将一个字符串转化为一个字节数组byte[]的方法
// digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
return new BigInteger(1, md.digest()).toString(16);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static byte[] getSALT(){
SecureRandom a=new SecureRandom();
return a.generateSeed(1);
}
public static String getMD5(String str){
return MD5(MD5(str)+USERKEY);
}
简单看一下就知道了
盐用的是固定值,规则在getMD5,这个方法就算写好了
@Test
public void aaaa() {
userMD5 a = new userMD5();
a.setUserName("1234");
a.setUserPassword("2234");
a.setUserName_md5(AppMD5Util.getMD5(a.getUserName()));
a.setUserPassword_md5(AppMD5Util.getMD5(a.getUserPassword()));
categoryMapper.userAdd(a);
}
测试类一切正常
虽然这个方法在controller层也能用,不过还是写在service层吧
public void userAdd( userMD5 a){
a.setUserName_md5(AppMD5Util.getMD5(a.getUserName()));
a.setUserPassword_md5(AppMD5Util.getMD5(a.getUserPassword()));
categoryMapper.userAdd(a);}
}
很简单的代码
一目了然
controller接口
也很一目了然
页面一目了然
添加的数据
延伸出几个小问题了
1.怎么判断用户输入的用户名不重复
2.每次调用add页面都会在数据库输入几个空数据,不知道该如何避免
收获
评论