• 存放密码的正确姿势 安全可靠加密 SHA-256(+Salt)


    在我们写后段的时候,经常会遇到需要使用数据库存放密码的操作。 但是对于密码等敏感字符,考虑安全性,直接原原本本的存放在数据里是绝对不安全的。 所以就需要对密码进行基于各种加密算法的加密。

    #SHA-256 简单了解
    #SHA-256 是什么?
    所谓SHA-256其实本质是一套单向哈希函数(或者叫做不可逆散列算法)。 他可以将一个字符串通过特定的计算过程后得出一个长度为256字节的Hash码。 该字符串里面任意一个字变动(甚至是大小写)都会尝试完全不一样的两条散列码。

    此外我们还需要特别记住,SHA-256本质是一套不可逆算法。 即字符串转化为散列码后,无法通过散列码将密码还原回来。

    至于这套SHA-256的具体计算过程,如果有兴趣自行Google,这里主要教大家使用。 不深入介绍底层实现算法。

    #SHA-256 破解?
    可能我们会在很多地方看到SHA256破解之类的工具,但是他们是如何实现的呢? 就目前为止,还没有能够逆向破解SHA256的工具.他们所谓的破解无非是不断的去 “碰撞”尝试。也就是不断的通过猜测源密码去生成SHA256哈希码值。所以他是相对安全的。 但是部分破解网站会讲所有已被破解的密码记录起来,方便直接找到。所以就有了加盐(Salt)

    #防止散列码被不断的碰撞猜到 —— 加盐(Salt)
    假设我们有一个需要加密的字段 abc123!@# 和 自定义盐 ABC

    先将加密字段的末尾加上盐(abc123!@#ABC) 进行SHA-256加密->得到任意 256 长度的散列码。

    再将得到的 256位散列码 在末尾加上我们的盐,再计算一次SHA-256的值->得到加了盐的256位散列码。

    此时我们存进数据库的就是加了盐的256位散列码。

    #加密后的密码验证
    这个就非常简单,SHA-256是不可逆加密,所以我们只需要将用户输入进来的密码,再过一遍SHA-256加密计算。 然后再和数据库内存的加密后密码对比,如果相同,说明用户输入的密码是正确的。

    #SHA-256 用它!
    #实现代码
    这里用到了 Apache 工具包

    import org.apache.commons.codec.binary.Hex;
    import java.nio.charset.StandardCharsets;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class SHA256Util {
    
        public static final String SHA256 = "SHA-256";
    
        // 加盐的SHA256加密
        // 可能抛出 NoSuchAlgorithmException 错误,表示加密格式有误。
        public static String encrypt_SHA256_Salt(String str, String salt) throws NoSuchAlgorithmException{
            // 进行加盐加密后给他放回
            return encrypt_SHA256(encrypt_SHA256(str + salt) + salt);
        }
    
        // 普通的SHA256加密
        private static String encrypt_SHA256(String str) throws NoSuchAlgorithmException{
            // 获取加密格式
            MessageDigest instance = MessageDigest.getInstance(SHA256);
            // 进行加密
            instance.update(var.getBytes(StandardCharsets.UTF_8));
            // 通过Hex的encodeHex函数,将每个byte都拆成了两个十六进制的数,并组合
            return String.valueOf(Hex.encodeHex(instance.digest()));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    #使用代码
    import org.yyc.util.SHA256Util; import java.security.NoSuchAlgorithmException;
    
    public class UserServiceImpl{
    
        public final String SALT = "ABC";
    
        public String register(String email, String passwd) {
            try {
                String encryptedPasswd = SHA256Util.encrypt_SHA256_Salt(passwd, SALT));
            } catch (NoSuchAlgorithmException exception) {
                return "Failed to register.";
            }
            // 将密码存进数据库
            return "Register successful.";
        }
    
        public String login(String email, String passwd) {
            String userPasswd;
            // 此处省略从数据库获取到用户密码的部分
            if (userPasswd.equals(SHA256Util.encrypt_SHA256_Salt(passwd, SALT))) {
                return "Login successful.";
            } else {
                return "The password is incorrect.";
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    Improper integral
    [PostgreSql]生产级别数据库安装要考虑哪些问题?
    springboot基于javaweb的社区留守儿童帮扶系统毕业设计源码101603
    java计算机毕业设计ssm+vue东莞大益球队管理系统
    全面对比GPT-3.5与LLaMA 2微调
    第十一章 api mgmnt API 参考
    财报解读:将低价作为“唯一性基础武器”的京东,效果在慢慢显现
    代码执行相关函数以及简单例题
    Linux—通过脚本方式配置ip地址失败
    在线设计数据库表用Itbuilder,极简易用真香!!!
  • 原文地址:https://blog.csdn.net/shelutai/article/details/133858131