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

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

 加密后效果图:

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值