MD5加密算法

释放双眼,带上耳机,听听看~!

MD5属不属于加密算法,因为只可以加密,无法获得密码原文,只能属于算法。

常见的加密算法

常用加密算法可以分为单向加密和双向加密。

  • 单向加密:只提供单向加密不能解密,不可逆的过程。通常用来存储用户名和密码,直接从前端传输来存储到数据库中
  • 双向加密:又分为对称性加密算法和非对称性加密算法。对称性加密算法,发送和接收端双方都知道秘钥和加密算法且秘钥都是相同的,之后便是对数据的加密和解密过程。非对称加密算法 :发送之前A B事先生成一对秘钥,A将秘钥发送给B,B将秘钥发送给 A,A先用B的秘钥加密密文在发送B,B解密,同理。

1.什么是MD5加密(单向加密)

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

2.MD5加密的功能

输入任意长度的信息,经过处理,输出都是128位的信息值

不同的输入对应的输出一定不同,保证唯一性

3.MD5加密的优点和缺点

优点:

  • 防止被篡改,在传输过程中一旦被串改,那么计算出的MD5值一定不同。
  • 计算速度快。加密速度快,不需要秘钥。
  • 检查文件的完整性,一旦文件被更改,MD5值也是不同的。
  • 防止看到明文,公司存放密码存放的是MD5值。
  • 防止抵赖,用于数字签名,一旦用户的文件被第三方MD5加密,若以后A说这个文件不是他写的,那么当用文件MD5后获得的签名一致,可以确认。

缺点:

  • 作为一种散列算法,虽然很难发生散列碰撞,但是经过证实,仍然存在两种不同数据会发生碰撞。
  • MD5的安全性:将用户的密码直接MD5后存储在数据库是不安全的。第一,用户普遍习惯用容易记忆的密码,生日,手机号等,黑客容易破译此类密码。这也是加盐值的一个原因。第二,直接MD5存入数据库,若数据库被破解,通过MD5反查会查到密码,需要随机盐值的配合。
  • 考虑到多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合,然后与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合也被称为rainbow table。

4.MD5的实现原理:

  • 填充:将输入信息进行512求余分组,若不等于448,那么进行填充 1 和0,一个1 N个0。最后的数据就为N*512+448
  • 记录信息长度:将得到的信息用64位存储填充之前的信息长度,这样448+64=512,总信息为N+1个512
  • 以四个常数ABCD与每组512位进行函数运算,最后输出的结果就是4组32位的常数。拼接得到MD5码

5.MD5加密 代码实现

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5加密
 */
public class MD5Utils {

    public static String code(String str){

        try {

            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(str.getBytes());
            byte[]byteDigest = messageDigest.digest();
            int i ;
            StringBuffer buffer = new StringBuffer("");
            for (int offset = 0; offset<byteDigest.length;offset++){
                i = byteDigest[offset];
                if(i<0)
                    i+=256;
                if(i<16)
                    buffer.append("0");
                buffer.append(Integer.toHexString(i));
            }
            //32位加密
            return buffer.toString();
            //16位加密
//            return buffer.toString().substring(8,24);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
}

人已赞赏
java综合技术

Java笔记

2021-9-23 17:03:15

wordpress综合技术

wordpress美化登录界面

2020-4-26 13:43:25

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索