加密与加盐

加密

我们在用户模块,对于用户密码的保护,通常都会进行加密。从最简单来说,小明盗取了你的数据库信息(小明躺枪),但由于你对你数据库中的用户信息的密码是加密的(我们假设加密之后的密文是无法破解的),那小明即使得到信息也没法进行登录。这是最最基本的一点防范措施。
我们通常的做法是,用户在提交注册信息时,在后台的业务逻辑中将密码进行加密(例如采用MD5或者BCrypt加密算法),所以存放在数据库中的信息为加密之后的密文。例如,如果小红在你的系统中注册了自己的账号,她提交的注册信息中的密码为”admin”,那么实际存到数据库中的密码为“21232F297A57A5A743894A0E4A801FC3”(假设采用MD5加密,并且不会被破解)。这样我们至少保证了只有小红本人能够通过其账号进行登录,因为密码只有她自己知道。

当小红用其账号进行登录的过程中,她将自己的用户名和密码提交给后台的服务器,服务器得到密码之后,采用同样的加密方法(MD5加密),也会得到密文,这个时候再与数据库中的密码字段的数据进行字符串的比较,相同就代表验证通过。
PS:顺便提一句,MD5和BCrypt加密算法都比较流行,相对来说,BCrypt算法比MD5更安全,但是加密更慢。

加盐

上文就是对于加密的一个简单陈述。那什么是加盐呢?当我第一次看到这个词的时候,我想到了我妈做的饭,因为我妈做饭一直都很淡= =
回到咱们要讲的加盐(Salt)。其实加盐是为了应对这么一种情况:如果两个人或多个人的密码相同,那么通过相同的加密算法得到的是相同的结果。这样会造成哪些后果呢?首先,破解一个就有可能是相当于破一片密码。而且加入小明这个用户可以查看后台数据库,那么如果他观察到小红这个用户的密码跟自己的密码是一样的(虽然都是密文),那么,也就代表他们两个人的密码是相同的。所以他就可以用小红的身份进行登录了。
其实,我们只要稍微混淆一下就能防范住了,这在加密术语中称为“加盐”。具体来说就是在原有材料(用户自定义密码)中加入其他成分(一般是用户自有且不变的因素),以此来增加系统复杂度。当这种盐和用户密码结合后,再通过摘要处理,就能得到隐蔽性更强的摘要值。

关于BCrypt加密的Demo

在本文中,将不去介绍如何实现MD5加密以及加盐,因为MD5太普遍。我记得在大一开始学Java的时候,每当遇到用户管理,对用户信息的加密都是通过MD5来进行的,但鉴于我自身的情况,我也是后期才晓得BCrypt这个加密算法,所以我也自己做了Demo来进行学习一下。
1、可以在官网中取得源代码http://www.mindrot.org/projects/jBCrypt/
2、通过Ant进行编译。编译之后得到jbcrypt.jar。也可以不需要进行编译,而直接使用源码中的java文件(本身仅一个文件)。
3、下面是官网的一个Demo

public class BCryptDemo {  
    public static void main(String[] args) {  
        // Hash a password for the first time  
        String password = "testpassword";  
        String hashed = BCrypt.hashpw(password, BCrypt.gensalt());  
        System.out.println(hashed);  
        // gensalt's log_rounds parameter determines the complexity  
        // the work factor is 2**log_rounds, and the default is 10  
        String hashed2 = BCrypt.hashpw(password, BCrypt.gensalt(12));  
        // Check that an unencrypted password matches one that has  
        // previously been hashed  
        String candidate = "testpassword";  
        //String candidate = "wrongtestpassword";  
        if (BCrypt.checkpw(candidate, hashed))  
            System.out.println("It matches");  
        else  
            System.out.println("It does not match");  
    }  
}  

在这个例子中,BCrypt.hashpw(password, BCrypt.gensalt())是核心。通过调用BCrypt类的静态方法hashpw对password进行加密。第二个参数就是我们平时所说的加盐。BCrypt.checkpw(candidate, hashed)该方法就是对用户后来输入的密码进行比较。如果能够匹配,返回true。

技术交流学习或者有任何问题欢迎加群

编程技术交流群 : 154514123 爱上编程

Java技术交流群 : 6128790  Java

Java中的MessageDigest类是一个用于创建消息摘要的工具类,它可以用于生成数据的哈希值。加密加盐是数据安全中的两个重要概念。加密是指使用某种算法将可读的数据(明文)转换成不可读的数据(密文),以防止数据泄露。而加盐则是指在加密前给数据添加随机数据(即“盐”),以增加密码的复杂度,使得相同的密码通过加盐后会得到不同的哈希值,从而提高安全性。 在Java中使用MessageDigest进行加密加盐的步骤通常包括以下几个: 1. 导入`java.security.MessageDigest`类。 2. 初始化MessageDigest实例,指定所需的加密算法(如SHA-256)。 3. 对数据进行分块处理,并使用MessageDigest的`update()`方法更新数据。 4. 调用`digest()`方法来计算数据的哈希值。 5. 如果要加盐,可以在更新数据之前将盐值与原始数据结合。 下面是一个简单的例子: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Base64; public class DigestWithSalt { public static String encrypt(String str, String salt, String algorithm) { try { // 创建MessageDigest实例 MessageDigest md = MessageDigest.getInstance(algorithm); // 加盐 byte[] saltBytes = salt.getBytes(); // 更新MessageDigest实例以加入盐 md.update(saltBytes); // 加密数据 byte[] bytes = md.digest(str.getBytes()); // 返回Base64编码后的字符串 return Base64.getEncoder().encodeToString(bytes); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } public static void main(String[] args) { String text = "password"; String salt = "somesalt"; String algorithm = "SHA-256"; String encryptedText = encrypt(text, salt, algorithm); System.out.println("加密后的文本:" + encryptedText); } } ``` 在上述代码中,我们定义了一个`encrypt`方法,该方法接受原始字符串、盐和加密算法作为参数,返回加密后的字符串。这里使用了Base64编码来将二进制数据转换成字符串形式,以便于查看和传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值