对于加密来说,MD5和SHA都比较流行。所谓加盐,无非是生成一个随机的salt在数据存储时提高数据的安全性,防止不法分子盗取用户个人信息。虽然MD5进行加密是不可逆的,但还是有弊端的。
举个简单的例子来说:如果数据库当中不同用户存储了相同的密码值,那么当知道其中一个用户的密码后就可以窥探出相同密码的用户,这样是很不安全的,因此如果使用MD5加密,我们都会选择对数据进行盐值加密存储——MD5 hash加盐,那就暂且不说MD5了,说一下Bcrypt。噗哈哈哈哈哈哈哈哈哈哈哈。
Bcrypt加密原理:
- 加密时,对于同一个密码,每次生成的hash是不同的,但是hash中包含了salt(hash产生过程:先随机生成salt,salt跟password进行hash)
- 校验时,从hash中取出salt,salt跟password进行hash,得到的结果跟数据库中提取的的hash进行比对返回Boolean类型:true/false
Bcrypt与MD5进行对比:
- 首先MD5加密后存储为32位,Bcrypt为60位。
- 相对来说BCrypt比MD5更安全,但是加密更慢。(简单MD5加密后密码一样,数据库当中不同用户存储了相同的密码值,那么当知道其中一个用户的密码后就可以窥探出相同密码的用户,BCrypt加密每次生成的密文是不一样的。如:$10$dH/eH7tuzPCkaFSfm44QXePkTxbfuhguLwC.hPmZ2Sp81bcdWbL1W 即使得到了原文密码,破译其他用户密码的机率是很小的)。
- Bcrypt加密有利也有弊,优点是安全性较高,弊端就是如果存储量比较大,性能消耗也是非常大的。
下面说一下Bcrypt的使用 :
可以选择使用jar文件,引入依赖(Maven环境)
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>
加密:u.getPassword()为传入原文密码, BCrypt.gensalt()为加盐值的方法
String pwd=BCrypt.hashpw(u.getPassword(), BCrypt.gensalt());
public static String gensalt(int log_rounds, SecureRandom random) {
StringBuffer rs = new StringBuffer();
byte rnd[] = new byte[BCRYPT_SALT_LEN];
random.nextBytes(rnd);
rs.append("$2a$");
if (log_rounds < 10)
rs.append("0");
if (log_rounds > 30) {
throw new IllegalArgumentException(
"log_rounds exceeds maximum (30)");
}
rs.append(Integer.toString(log_rounds));
rs.append("$");
rs.append(encode_base64(rnd, rnd.length));
return rs.toString();
}
对比:password为传入密码,user.getPassword()为数据库中加密后密码,进行对比后方法返回Boolean类型:true/fales
BCrypt.checkpw(password,user.getPassword())
public static boolean checkpw(String plaintext, String hashed) {
byte hashed_bytes[];
byte try_bytes[];
try {
String try_pw = hashpw(plaintext, hashed);
hashed_bytes = hashed.getBytes("UTF-8");
try_bytes = try_pw.getBytes("UTF-8");
} catch (UnsupportedEncodingException uee) {
return false;
}
if (hashed_bytes.length != try_bytes.length)
return false;
byte ret = 0;
for (int i = 0; i < try_bytes.length; i++)
ret |= hashed_bytes[i] ^ try_bytes[i];
return ret == 0;
}
加密后效果图:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115857.html