常见的加密方式以及自定义加密工具

常见的加密方式

1、对称加密(可逆)

加密操作:用户输入的明文+密钥得到加密的结果,加密结果存储到数据库中

解密操作:密文通过密钥进行解密得到明文

2、Hash加密(不可逆)

加密操作:明文通过哈希算法进行加密,加密后的密文存储到数据库中

验证密码操作:用户输入的明文通过同样的哈希算法进行加密,比对数据库中的密文,看是否一致

3、Hash+盐值加密(盐值就是随机数)

加密操作:明文通过哈希算法进行加密,得到加密结果,生成盐值,加密结果和盐值进行拼接得到最终加密结果

验证密码操作:用户输入的明文通过相同的哈希算法进行加密,得到加密结果,接着从数据库中获取盐值,加密结果和盐值经过相同的拼接方式得到最终结果,最终结果和数据库中存储的最终结果进行比对,看是否一致

自定义一个加密工具

public class SecurityUtil {
    /**
     * 加密
     */
    public static String encrypt(String password) {
        if (!StringUtils.hasLength(password)) {
            throw new RuntimeException();
        }
        //1.生成盐值
        String salt = UUID.randomUUID().toString().replace("-", "");//把-替换成空字符
        //2.盐值+password(也可以使用其他的拼接规则,看心情)
        //3.对 盐值+password 进行加密 得到密文
        String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        //数据库中保存盐值 和 密文 得到64位16进制的数据
        return salt + securityPassword;
    }
    /**
     * 验证
     */
    public static boolean verify(String inputPassword, String sqlPassword) {
        //参数校验
        if (!StringUtils.hasLength(inputPassword) || !StringUtils.hasLength(sqlPassword)) {
            return false;
        }
        if (sqlPassword.length() != 64) {
            return false;
        }
        //获取盐值
        String salt = sqlPassword.substring(0, 32);
        //得到32位的密文
        String securityPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes(StandardCharsets.UTF_8));
        return sqlPassword.equals(salt + securityPassword);
    }
}

使用现成的工具

我们也可以使用现成的工具

首先引入依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.25</version>
</dependency>

编写测试代码,这里我们对密码进行哈希算法+sha256的方法加密,对于电话号码,使用对称加密

@SpringBootTest
public class EncryptTest {

    //密码  hash sha256
    @Test
    void sha256Test() {
        String password = DigestUtil.sha256Hex("123456");
        System.out.println("sha256 hash 处理后的结果为");
        System.out.println(password);
        //8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
    }

    //手机号 对称加密 aes
    @Test
    void aesTest() {
        //生成密钥,密钥长度必须是16字节或者24或者32
        byte[] key = "1234556789abcdef".getBytes(StandardCharsets.UTF_8);

        //生成aes对象
        AES aes = SecureUtil.aes(key);

        //加密
        String encrypted = aes.encryptHex("12345");
        System.out.println("经过aes加密后的结果为: " + encrypted);

        //解密
        String decryptStr = aes.decryptStr(encrypted);
        System.out.println("经过aes解密后的结果为:" + decryptStr);

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值