简述MD5加密[通俗易懂]

简述MD5加密[通俗易懂]MD5加密publicclassMD5{ /**四个链接变量标准幻数(按大端字节序存储-高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端)*/privatefinalintA=0x67452301;//01234567privatefinalintB=0xefcdab89;//89abcdef…

大家好,又见面了,我是你们的朋友全栈君。

1.什么是MD5加密

MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
MD5加密是一种不可逆的加密算法,不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。
——百度百科

2.为什么要使用MD5加密

在存储一些敏感的信息的时候,如果不进行加密则容易出现安全问题。例如:用户存储的密码,如果数据中的密码采用明文,一旦数据库泄露,则用户密码直接泄露。但是使用MD5加密算法之后即使数据泄露,这些密码也无法激活成功教程,保证了数据的安全性。

3.MD5的工具类

public class MD5Util { 

/* *四个链接变量 标准幻数(按大端字节序存储-高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端) */
private final int A=0x67452301;//01234567
private final int B=0xefcdab89;//89abcdef
private final int C=0x98badcfe;//fedcba98
private final int D=0x10325476;//76543210
/* *ABCD的临时变量 */
private int Atemp,Btemp,Ctemp,Dtemp;
/* *常量T *公式:floor(abs(sin(i+1))×(2pow32) pow:2的32次幂 */
private final int T[]={ 

0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,
0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,
0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,
0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,
0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,
0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,
0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,
0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,
0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,
0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,
0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,
0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
};
/* *向左位移数,计算方法未知 */
private final int s[]={ 

7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,
6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21
};
/* *初始化函数 */
private void init(){ 

Atemp=A;
Btemp=B;
Ctemp=C;
Dtemp=D;
}
/* *移动一定位数 */
private int shift(int a,int s){ 

return(a<<s)|(a>>>(32-s));//右移的时候,高位一定要补零,而不是补充符号位
}
/* *主循环 */
private void MainLoop(int M[]){ 

int F,g;
int a=Atemp;
int b=Btemp;
int c=Ctemp;
int d=Dtemp;
for(int i = 0; i < 64; i++){ 

if(i<16){ 

F=(b&c)|((~b)&d);
g=i;
}else if(i<32){ 

F=(d&b)|((~d)&c);
g=(5*i+1)%16;
}else if(i<48){ 

F=b^c^d;
g=(3*i+5)%16;
}else{ 

F=c^(b|(~d));
g=(7*i)%16;
}
int tmp=d;
d=c;
c=b;
b=b+shift(a+F+T[i]+M[g],s[i]);
a=tmp;
}
Atemp=a+Atemp;
Btemp=b+Btemp;
Ctemp=c+Ctemp;
Dtemp=d+Dtemp;    
}
/* *填充函数 *处理后应满足bits≡448(mod512),字节就是bytes≡56(mode64) *填充方式为先加一个1,其它位补零 *最后加上64位的原来长度 */
private int[] add(String str){ 

int num=((str.length()+8)/64)+1;//以512位,64个字节为一组
int strByte[]=new int[num*16];//64/4=16,所以有16个整数
for(int i=0;i<num*16;i++){ 
//全部初始化0
strByte[i]=0;
}
int i;
for(i=0;i<str.length();i++){ 

strByte[i>>2]|=str.charAt(i)<<((i%4)*8);//一个整数存储四个字节,小端序
}
strByte[i>>2]|=0x80<<((i%4)*8);//尾部添加1
/* *添加原长度,长度指位的长度,所以要乘8,然后是小端序,所以放在倒数第二个,这里长度只用了32位 */
strByte[num*16-2]=str.length()*8;
return strByte;
}
/* *调用函数 */
public String getMD5(String source){ 

init();
int strByte[]=add(source);
for(int i=0;i<strByte.length/16;i++){ 

int num[]=new int[16];
for(int j=0;j<16;j++){ 

num[j]=strByte[i*16+j];
}
MainLoop(num);
}
return changeHex(Atemp)+changeHex(Btemp)+changeHex(Ctemp)+changeHex(Dtemp);
}
/* *整数变成16进制字符串 */
private String changeHex(int a){ 

String str="";
for(int i=0;i<4;i++){ 

str+=String.format("%2s", Integer.toHexString(((a>>i*8)%(1<<8))&0xff)).replace(' ', '0');
}
return str;
}
/* *单例 */
private static MD5 instance;
public static MD5 getInstance(){ 

if(instance==null){ 

instance=new MD5();
}
return instance;
}   
private MD5(){ 
};
}

4.如何使用MD5加密:测试代码

public class Test{ 
    
public static void main(String[] args){ 

String data1 = "123456";
String str1=MD5Util.getInstance().getMD5(data1);
System.out.println(str1);
String data2 = "123456abcdefghjklmnopqrstuvwxyz";
String str2=MD5Util.getInstance().getMD5(data2);
System.out.println(str2);
String data3 = "123456";
String str3=MD5Util.getInstance().getMD5(data3);
System.out.println(str3);
}
}

结果

e10adc3949ba59abbe56e057f20f883e
9bc55d239bcc0cf3bffa5b930b0ac12e
e10adc3949ba59abbe56e057f20f883e

1.因为MD5加密得到的结果长度是固定的。所以不论传入字符串长度结果的长度是一样的。
2.当传入的字符串相同的时候经过MD5加密的结果也是一样的。

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157660.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 简述TCP四次挥手

    简述TCP四次挥手四次握手主要用到了两个标志位(ACK&FIN):ACK示意参考:TCP三次握手FIN:终止数据传输标志位—->当FIN为1的时候代表此数据为终止断开连接的请求四次挥手流程:由于TCP连接是双向传输的对等的模式即双工wiki百科定义:全双工(full-duplex)的系统允许二台设备间同时进行双向资料传输。全双工的系统可以用复线铁路类比。两个方向的车辆因使用不同的轨道,因此不会互相影响。一般的电话、手机就是全双工的系统,因为在讲话时同时也可以听到对方的声音意思是说

  • JVM垃圾回收机制【简单介绍】[通俗易懂]

    JVM垃圾回收机制【简单介绍】[通俗易懂]Java虚拟机(JVM)垃圾回收机制JVM中的垃圾回收计数是采用的一种自适应的技术(可以通过其工作方式将它“啰嗦地”称为:自适的、分代的、停止-复制、标记-清扫式垃圾回收器)在讲Java虚拟机的自适应回收机制前,有必要说一下其他比较单纯的垃圾回收机制,然后会比较容易地理解JVM的垃圾回收:1、引用计数一种简单但速度很慢的垃圾回收计数。​ 每个对象都含有一个引用计数器,当有引用连接至对…

  • Linux常用命令详解「建议收藏」

    Linux常用命令详解「建议收藏」安装和重启查看帮助命令`man命令名#查看命令的详细说明(man是manual的缩写)命令名-help#查看命令的常用选项下载命令wgethttps://www.zabbix.com/download#下载网页源码curlwww.baidu.com安装命令从源代码安装:./configuremakemakeinstall系统属性命令文件命令文件…

  • MySQL数据库建立数据库和表(命令行方式)

    MySQL数据库建立数据库和表(命令行方式)最近在学数据库系统概论,以前建表都是直接用workbeach,但是作为一个计算机专业的学生,我觉得能敲的时候就少点,所以分享一个自己用命令创建数据库和表的过程,希望对一些人有点用!安装好数据库后,我们可以看到这些东西可以这么简单的认识,划红线的是通过命令行来操作数据库,划绿线的是操作数据库的图形化界面,这里我分享的是通过命令行来操作,以《数据库系统概论》第五版第三章为例创建一个我们平时…

  • 关于Android 10.0适配,看这篇就够了

    本文将从三个角度介绍AndroidQ的部分适配问题,也是大家开发适配过程中大概率会遇到的问题:Q行为变更:所有应用(不管targetSdk是多少,对所有跑在Q设备上的应用均有影响) Q行为变更:以AndroidQ为目标平台的应用(targetSDK==Q才有影响) 项目升级遇到的问题至于Q的新功能及SDK,项目中并没有涉及,故暂不介绍,只放出链接AndroidQ新AP…

  • 有极性电容和无极性电容的区别_非极性电容

    有极性电容和无极性电容的区别_非极性电容有极性电容与无极性电容的概述有极性电容与无极性电容的概述有极性电容的识别有极性电容于无极性电容的区别网友见解有极性电容与无极性电容的概述理想的电容,本来是没有极性的。但是在实际中,为了获得大容量,就使用了某些特殊的材料和结构,这就导致了实际的电容有些是有极性的。常见的有极性电容有铝电解电容,钽电解电容等。电解电容一般是容量相对比较大的。如果要做一个大容量的无极性电容,就没那…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号