我们以前的加密方法是否对这种行为失效了呢?其实只要稍微混淆一下就能防范住了,这在加密术语中称为“加盐”。具体来说就是在原有材料(用户自定义密码)中加入其它成分(一般是用户自有且不变的因素),以此来增加系统复杂度。当这种盐和用户密码相结合后,再通过摘要处理,就能得到隐蔽性更强的摘要值。下面请见代码:
// 对密码进行加盐后加密,加密后再通过Hibernate往数据库里存 String changedPswd=DigestUtils.md5Hex(name+pswd);
就是这样简单,上面代码中盐就是用户名,可以的话还可以用用户注册时的邮件,注册时间等非空信息(如果是空信息这个加盐处理会失效)。
下面是数据库中两个用户的记录,他们的实际登录密码都是123456,但光看用户记录是完全看不出来的。这下别有用心的人打开数据库看到的密码都完全不一样,他以前的手段就失效了。
因为密码是md5处理的密码加用户名,因为用户名都不相同,所以即使密码相同的用户,保存到数据库中密码也是不同的。
import org.apache.commons.codec.digest.DigestUtils;
public class AtomicDemo extends Thread{
public static String key="keys";
public static void add(int i) throws InterruptedException{
System.out.println(DigestUtils.shaHex(key)+"======"+i+"======="+DigestUtils.shaHex(key+i));
}
public void run() {
for (int i = 0; i < 10; i++) {
try{
add(i);
sleep(10);
}catch(Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception{
Thread thread=new AtomicDemo();
thread.start();
}
}
运行结果
5944ae25418ceabcf285dca1d721b77888dac89b======0=======fb61f74ca71dc6d48c7457f5e16b3552f06f0c8d
5944ae25418ceabcf285dca1d721b77888dac89b======1=======5c26398bddc6a83d04a0f2c99b6d48aaaeefca7d
5944ae25418ceabcf285dca1d721b77888dac89b======2=======054a54de9e39630979ffccad0294bccb9e648ea2
5944ae25418ceabcf285dca1d721b77888dac89b======3=======a32cfde3c1f0041ac5f5d4b8d89522b5094c9804
5944ae25418ceabcf285dca1d721b77888dac89b======4=======de5710c8cedbf9b2c4ae26f10ed845b15118db01
5944ae25418ceabcf285dca1d721b77888dac89b======5=======c1523fc3afabfb5db883605324252c79787938b9
5944ae25418ceabcf285dca1d721b77888dac89b======6=======60803f24f49154d9e65a4acf9c7c6b1cb130c8f2
5944ae25418ceabcf285dca1d721b77888dac89b======7=======881a14c6013d51ca24f152973a1fd51da37d1143
5944ae25418ceabcf285dca1d721b77888dac89b======8=======ef15a93a59f824a73fe1c054140f15f200b8a4b2
5944ae25418ceabcf285dca1d721b77888dac89b======9=======d44cc54ccf1e357922c5878df32e078084b0c531
可以比对出加盐之前和之后的结果
// 对密码进行加盐后加密,加密后再通过Hibernate往数据库里存 String changedPswd=DigestUtils.md5Hex(name+pswd);
就是这样简单,上面代码中盐就是用户名,可以的话还可以用用户注册时的邮件,注册时间等非空信息(如果是空信息这个加盐处理会失效)。
下面是数据库中两个用户的记录,他们的实际登录密码都是123456,但光看用户记录是完全看不出来的。这下别有用心的人打开数据库看到的密码都完全不一样,他以前的手段就失效了。
因为密码是md5处理的密码加用户名,因为用户名都不相同,所以即使密码相同的用户,保存到数据库中密码也是不同的。
import org.apache.commons.codec.digest.DigestUtils;
public class AtomicDemo extends Thread{
public static String key="keys";
public static void add(int i) throws InterruptedException{
System.out.println(DigestUtils.shaHex(key)+"======"+i+"======="+DigestUtils.shaHex(key+i));
}
public void run() {
for (int i = 0; i < 10; i++) {
try{
add(i);
sleep(10);
}catch(Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception{
Thread thread=new AtomicDemo();
thread.start();
}
}
运行结果
5944ae25418ceabcf285dca1d721b77888dac89b======0=======fb61f74ca71dc6d48c7457f5e16b3552f06f0c8d
5944ae25418ceabcf285dca1d721b77888dac89b======1=======5c26398bddc6a83d04a0f2c99b6d48aaaeefca7d
5944ae25418ceabcf285dca1d721b77888dac89b======2=======054a54de9e39630979ffccad0294bccb9e648ea2
5944ae25418ceabcf285dca1d721b77888dac89b======3=======a32cfde3c1f0041ac5f5d4b8d89522b5094c9804
5944ae25418ceabcf285dca1d721b77888dac89b======4=======de5710c8cedbf9b2c4ae26f10ed845b15118db01
5944ae25418ceabcf285dca1d721b77888dac89b======5=======c1523fc3afabfb5db883605324252c79787938b9
5944ae25418ceabcf285dca1d721b77888dac89b======6=======60803f24f49154d9e65a4acf9c7c6b1cb130c8f2
5944ae25418ceabcf285dca1d721b77888dac89b======7=======881a14c6013d51ca24f152973a1fd51da37d1143
5944ae25418ceabcf285dca1d721b77888dac89b======8=======ef15a93a59f824a73fe1c054140f15f200b8a4b2
5944ae25418ceabcf285dca1d721b77888dac89b======9=======d44cc54ccf1e357922c5878df32e078084b0c531
可以比对出加盐之前和之后的结果