使用MD5+盐对密码进行加密

为什么要对密码加密?

因为密码存储的时候不能明文存贮,对密码加密可以保护用户信息安全

什么是对称加密?

对称加密:A拿着一个规则进行加密,B拿着这个规则解密

为什么要加盐?

为防止字典破解和暴力破解的破解方式来破解。如果知道了数据库中密码的哈希值,用查表法,逆向查表法、彩虹表等。当知道某个密码的哈希值时,只需要在建立好的表中查找该值,你就知道对应的密码,盐就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放在前面或后面都可以),然后将concat后的字符串加密。采用这种方式加密密码,查表法就不灵了(因为盐是随机生成)

密码加盐的实现方式?

密码:字符串password(用户输入)盐值:salt(随机生成),每次加盐加密都要把盐值给存起来,下次用户登录的时候就要获取盐值,和数据库里面已经加密好的字符串进行匹配。

 

复制代码
// 获取用户密码
String userPwd = user.getUserPwd();
// 获取盐值
String salt = getRandomString(4);
// 盐值加上密码
String password = salt + userPwd;
// 对加上盐值的密码进行加密
String md5 = EncryptionUtils.encryptMD5(password);
// 把加密后的密码存到user对象中
user.setUserPwd(md5);
// 把盐值存入user对象中
user.setUsersSalt(salt);
复制代码

可以把盐加在密码前面,也可以把盐加在密码后面,同时也可以加在中间,如果还嫌不够安全,也可以加多个盐值,也就是多重加盐,会更安全更保险。

生成盐的方法

复制代码
//length用户要求,随机产生字符串的长度
    public static String getRandomString(int length){
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i < length ; i++){
            int number = random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }
复制代码

MD5加密工具类

复制代码
public class EncryptionUtils {

    public static String encryptMD5(String password) {
        MessageDigest md = null;
        byte[] digest = null;
        try {
            md = MessageDigest.getInstance("MD5");
            digest = md.digest(password.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        assert digest != null;
        return new BigInteger(1, digest).toString(16);
    }
    
    public static void main(String[] args) {
        System.out.println(encryptMD5("0"));
    }
}
复制代码
posted @   时光里的少年  阅读(1322)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示