MD5加密和解密(用Hutool工具)

@Slf4j
@SpringBootTest
class Md5DemoApplicationTests {

    /*
    todo:
     1. md5被加密的明文一致则加密后的密文必然一致
     2. md5加密后的密文 不可以还原回 明文(不可逆)
     */
    @Test
    void test01() {
        /*
        因为 md5加密算法不可逆,所以加密后的密文是固定的,
        用户输入的密码是对的则密文一定也是对的
        注册: 123456->e10adc3949ba59abbe56e057f20f883e->入库
        登录:123456->加密->e10adc3949ba59abbe56e057f20f883e->与数据库进行比较->登录成功
         */
        String md5Hex = DigestUtil.md5Hex("123456");
        System.out.println(md5Hex);
    }


    @Test
    void testRainbowTable() {
        /*
        提前获取了123456的密文e10adc3949ba59abbe56e057f20f883e
        彩虹表:常见密码的md5结果集
        */
        HashMap<String, String> map = new HashMap<>();
        for (int i = 0; i < 200000; i++) {
            map.put(String.valueOf(i),DigestUtil.md5Hex(String.valueOf(i)));
        }
        String md5Hex = map.get("123456");
        log.info("破译后的密码为:{}",md5Hex);
    }

    @Test
    void testAddSalt() {
        String password = "123456";
        //给明文密码增加一个随机数(盐),让密文更难被破解
        Random rand = new Random();
        int salt = rand.nextInt(1000) + 1000;//salt字段入库
        password = password + salt;//1234561037 ->实际被加密的明文
        log.info("salt:" + salt);
        log.info("password:" + password);
        /*
            664536ded67610c936d302f5bcf2ca47->推导出来的是1234561629
            黑客以为1234561629是密码,然而真正的密码是123456
         */
        String md5Hex = DigestUtil.md5Hex(password);
        log.info("md5Hex:" + md5Hex);
                /*
            password                                salt
            664536ded67610c936d302f5bcf2ca47        1629
         */
    }

    @Test
    void testAddSaltAndIndex() {
        String password = "123456";
        //给明文密码增加一个随机数,让密文更难被破解
        Random rand = new Random();
        int salt = rand.nextInt(1000) + 1000;//salt字段入库
        log.info("salt:{}", salt);
        //随机的插入位置
        int index = rand.nextInt(password.length());//index字段入库
        log.info("index:{}", index);
        password = password.substring(0, index) + salt + password.substring(index);
        log.info("加盐后的密码:{}", password);
        String md5Hex = DigestUtil.md5Hex(password);
        log.info("md5Hex:{}", md5Hex);
        /*
            password                                salt            index
            a9ab727a7838b2c8d0acb5fc3ffb602a        1559              5
         */
    }

    @Test
    void testDecode() {
        String password = "123456";
        int salt = 1172;
        int index = 5;
        String finalPassword = password.substring(0, index) + salt + password.substring(index);
        log.info("password:{}", finalPassword);
        if ("9964a8c3a1cf3c40795d2ed0ac8fa7ca".equals(DigestUtil.md5Hex(finalPassword))) {
            log.info("密码正确");
        } else {
            log.info("密码错误");
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值