最近在做一个网站,需要对用户信息进行加密,认证。提高相对的信息安全。
由于是偏商业的网站,不能像自己做课程设计时贪图方便采用明文传输,在调研之后注意到了Apache的Shiro框架。
String string1 = "abcde";
String base64Encode = Base64.encodeToString(string1.getBytes());
System.out.println(base64Encode);
String base64Decode = Base64.decodeToString(base64Encode);
System.out.println(base64Decode);
/*
* base64加密
*/
if (base64Encode.equals(Base64.encodeToString("abcde".getBytes()))) {
System.out.println("相等字串");
} else {
System.out.println("不相等");
}
YWJjZGU=
abcde
相等字串
String str1 = "hello";
String salt = "12";
String md5 = new Md5Hash(str1, salt).toString();
System.out.println(md5);
if ((new Md5Hash("hello", salt).toString()).equals(md5)) {
System.out.println("ok");
} else {
System.out.println("no");
}
132017ca4f9fde7a8011b76f24de44b4
ok
Md5Hash类的构造方式其中之一为
1. public Md5Hash(Object source, Object salt) {
super("MD5", source, salt);
}
该方法接受两个参数,分别为源字符串(待加密字串),salt串,即我们经常说的“加盐”。
散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,
一般适合存储密码之类的
数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如
加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一
些md5 解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相
对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和ID(即盐);
这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。
--《跟我学shiro》 张开涛
调用toString方法将结果转为字符串即132017ca4f9fde7a8011b76f24de44b4。这串奇怪的字串即为哈希过的串。保存到数据库中即使泄露也能相对保证安全。
在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前 的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。