zoukankan      html  css  js  c++  java
  • MD5加密

    MD5:一种哈希算法

    实质上,MD5 只是一种哈希算法。

    哈希算法,即 hash,又叫散列算法,是一类把任意数据转换为定长(或限制长度)数据的算法统称。例如我叫张三,你叫李四,那么「人 -> 人名」的算法就叫属于一种哈希算法。哈希算法通常用于制作数字指纹,数字指纹的意思就是「你看到这个东西就像看到原数据一样」,例如我们在一些网站下载大文件的时候,网站提供给我们验证文件完整性的 MD5 或者 SHA1 码,就是原文件的哈希值。哈希算法有很多种,MD5 是其中的一种,这就是 MD5。所以,优秀的哈希算法通常需要具有低碰撞概率(即不同数据的哈希值通常也不一样)。

    加密是什么?

    加密,指的是对数据进行转换以后,数据变成了另一种格式,并且除了拿到解密方法的人,没人能把数据转换回来。因此,加密通常用于网络通信。因为网络上的通信数据,任何人都有可能会拿到,把数据加密后再传送,送达以后由对方解密后再查看,就可以防止网络上的偷窥。例如大家都知道「安全」但很少人知道「为什么安全」的 HTTPS,就是通过加密算法来保障的网络安全性。

    所以,MD5 是加密吗?

    加密算法的目的,在于别人无法成功查看加密后的数据,并且在需要的时候还可以对数据进行解密来重新查看数据。而 MD5 算法是一种哈希算法,哈希算法的设计目标本身就决定了,它在大多数时候都是不可逆的,即你经过哈希算法得出的数据,无法再经过任何算法还原回去。所以,既然不能将数据还原,也就不能称之为可以解密;既然不能解密,那么哈希的过程自然也就不能称作是「加密」了。


    1 加密方法:

    1.1 java自带jar工具MessageDigest实现 
    java.security.MessageDigest

    public class MD5Utils {
        public static String stringToMD5(String plainText) {
            byte[] secretBytes = null;
            try {
                secretBytes = MessageDigest.getInstance("md5").digest(
                        plainText.getBytes());
            } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException("没有这个md5算法!");
            }
            String md5code = new BigInteger(1, secretBytes).toString(16);
            for (int i = 0; i < 32 - md5code.length(); i++) {
                md5code = "0" + md5code;
            }
            return md5code;
        }
    
    }
    

      

    1.2 spring自带的工具DigestUtils实现 
    org.springframework.util.DigestUtils

    DigestUtils.md5DigestAsHex("1234".getBytes())
    

      

    2 使用方法:

    @Test
    public void testMd5() throws NoSuchAlgorithmException{
        MessageDigest md = MessageDigest.getInstance("MD5");
        // java自带工具包MessageDigest  
        String resultString = MD5Utils.md5("123456");
        System.out.println(resultString);
        // e10adc3949ba59abbe56e057f20f883e
        String resultString1 = MD5Utils.md5("1234");
        System.out.println(resultString1);
        //81dc9bdb52d04dc20036dbd8313ed055
    
        // spring自带工具包DigestUtils
        System.out.println(DigestUtils.md5DigestAsHex("1234".getBytes()));
        // 81dc9bdb52d04dc20036dbd8313ed055
    }
    

      

  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/xinruyi/p/11441607.html
Copyright © 2011-2022 走看看