MD5加密算法的使用 (及加盐操作)
/**
* @Des 得到相应的一个MD5加密后的字符串
* @param psd
* @param salt
* @return MD5加密后的字符串
*/
public static String encoder(String psd, String salt) {
try {
StringBuffer stingBuffer = new StringBuffer();
// 1.指定加密算法
MessageDigest digest = MessageDigest.getInstance("MD5");
// 2.将需要加密的字符串转化成byte类型的数据,然后进行哈希过程
byte[] bs = digest.digest((psd + salt).getBytes());
// 3.遍历bs,让其生成32位字符串,固定写法
// 4.拼接字符串
for (byte b : bs) {
int i = b & 0xff;
String hexString = Integer.toHexString(i);
if (hexString.length() < 2) {
hexString = "0" + hexString;
}
stingBuffer.append(hexString);
}
return stingBuffer.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
注意:
这种方式加密其实是使用的:md5($pass.$salt):盐值字符串加在密码字符串后面
在使用shiro框架登录验证使用md5加盐加密是:md5($salt.$pass):盐值字符串加在密码字符串前面
例如:
用介绍的这种写法写加密的结果为:b5f09dedae0dbf39078979264a7cd2cd
1)
而使用shiro框架登录验证加密的结果为:9f9c3ec0287e769e48482b1d29dd4e23
2)
所以在使用shiro框架设置密码,对密码进行加密的时候,使用:
String password = new SimpleHash("MD5","111111","XXXXXX").toString();,new SImpleHash使用的是将盐值字符串加在密码字符串前面,即md5($salt.$pass)
当然如果对该段代码中的
byte[] bs = digest.digest((psd + salt).getBytes());psd与salt的位置交换,加密的结果就为md5($salt.$pass)这种格式
md5($pass.$salt)与md5($salt.$pass)其实本质上只是盐值字符串加在密码字符串后或前