摘要加密算法——MD5加密

导读:本篇文章讲解 摘要加密算法——MD5加密,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

摘要加密

摘要数据:47bce5c74f589f4867dbd57e9ca9f808

摘要是哈希值,我们通过散列算法比如MD5算法就可以得到这个哈希值。摘要只是用于验证数据完整性和唯一性的哈希值,不管原始数据是什么样的,得到的哈希值都是固定长度的。
​ 不管原始数据是什么样的,得到的哈希值都是固定长度的,也就是说摘要并不是原始数据加密后的密文,只是一个验证身份的令牌。所以我们无法通过摘要解密得到原始数据。

常用的摘要算法有:MD5算法(MD2 、MD4、MD5),SHA算法(SHA1、SHA256、SHA384、SHA512),HMAC算法

摘要加密算法特性:

  • 任何数据加密,得到的密文长度固定。

  • 密文是无法解密的(不可逆)。

目前网上的MD5解密网站的原理是通过穷举将一些常用的密码,如:123,abc等数据,将其通过MD5算法加密后,然后存进数据库中。我们在线解密时,他只不过将我们的加密字符串与数据库中的数据进行对比,然后将对应的密码返回给我们。如果是一些通过加盐生成的复杂MD5加密字符串就解密失败了。

MD5算法

image-20211212115013562

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

MD5存在一个缺陷,只要明文相同,那么生成的MD5码就相同,于是攻击者就可以通过撞库的方式来破解出明文。加盐就是向明文中加入指定字符,主要用于混淆用户、并且增加MD5撞库破解难度,这样一来即使撞库破解,知道了明文,但明文也是混淆了的,真正需要用到的数据也需要从明文中摘取,摘取范围、长度、摘取方式都是个谜,如此一来就大大增加了暴力破解的难度,使其几乎不可能破解。

接下来我们直接通过JAVA编写一个MD5的加密工具类:

首先我们需要引入相关的依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
    </dependency>
</dependencies>

然后开始编写工具类:

public class MD5 {

    /**
     * MD5方法
     * @param text 明文
     * @return 密文
     * @throws Exception
     */
    public static String md5(String text) throws Exception {
        //加密后的字符串
        String encode= DigestUtils.md5Hex(text);
        return encode;
    }

    /**
     * MD5方法
     * @param text 明文
     * @param key 盐
     * @return 密文
     * @throws Exception
     */
    public static String md5(String text, String key) throws Exception {
        //加密后的字符串
        String encode= DigestUtils.md5Hex(text + key);
        return encode;
    }

    /**
     * MD5验证方法
     * @param text 明文
     * @param key 密钥
     * @param md5 密文
     * @return true/false
     * @throws Exception
     */
    public static boolean verify(String text, String key, String md5) throws Exception {
        //根据传入的密钥进行验证
        String md5Text = md5(text, key);
        return md5Text.equalsIgnoreCase(md5);
    }
}

验签

验签其实就是签名验证,MD5加密算法经常用于签名安全验证。关于验签,我们用下面这个流程图来说明:

image-20211212115254887

1:mall-order-service向mall-pay-service服务发送数据前,先对数据进行处理。
2:先把数据封装到Map中,再对数据进行排序。
3:获取排序后的数据的MD5只,并将MD5只封装到Map中。
4:把带有MD5只的Map传给mall-pay-service。
5:mall-pay-service中获取到数据,移除Map中的MD5值,再将Map排序。
6:获取排序后的MD5值,并且对比传过来的MD5值。
7:两个MD5值如果一样,证明该数据安全,没有被修改,如果不一样,证明数据被修改了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16773.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!