Spring Security 登录注册时使用Bcrypt加盐进行加密

导读:本篇文章讲解 Spring Security 登录注册时使用Bcrypt加盐进行加密,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

对于加密来说,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;
	}

 加密后效果图:

 Spring Security 登录注册时使用Bcrypt加盐进行加密

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115857.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!