MD5加密是一种常用的加密方法,常用于保存用户密码和密钥信息。那么它是什么,它有什么好处呢?它将在应用程序开发中得到广泛应用。
1、什么是MD5
MD5加密的整个过程就是Message-Digest Algorithm 5(Message-Digest Algorithm)对信息进行抽象,然后通过一定的位运算得到加密的MD5字符串。
比如我们要加密一篇文章,那么我们会从每一段或者每一行中随机取一个字,对这些字进行计数,然后通过一定的运算得到一条定长的MD5加密报文。因此,很难反向破解。
2、MD5有哪些特点
MD5加密的特点如下:
1.用于数据、字符串等。由于要加密的长度不同,它都可以返回一个固定长度的MD5加密字符串。(通常是32位十六进制字符串);
2.它的加密过程几乎是不可逆的,除非维护一个巨大的键值数据库用于冲突破解,否则几乎无法解密。
3.操作简单,可以多种方式实现,通过一定的处理方法可以避免碰撞算法的破解。
4.对于固定字符串。数字等。MD5加密的字符串是固定的,也就是说不管MD5加密多少次,得到的结果都是一样的。
3.MD5加密的Java实现
事不宜迟,直接进入代码:
公共静态字符串getMD5String(String str) {
尝试{
//生成MD5加密的计算摘要
message digest MD=message digest . getinstance(' MD5 ');
//计算md5函数
MD . update(str . getbytes());
//digest()最终确定返回md5哈希值,返回值为8位字符串。因为md5哈希值是16位十六进制值,所以它实际上是8位字符。
//BigInteger函数将8位字符串转换为16位十六进制值,用字符串表示;获取字符串形式的哈希值。
//一个字节是八位二进制,即两个十六进制字符(2的8次方等于16的2次方)
返回新的BigInteger(1,md.digest())。toString(16);
} catch(异常e) {
e . printstacktrace();
返回null
}
}
以上是使用Java自带的MessageDigest类实现的最简单的MD5加密方法。没有对加密过程进行任何处理。下面相对更复杂。
包com . mmall . util;
导入Java . security . message digest;
/**
*由dt创建
*/
公共类MD5Util {
//这里主要遍历8个字节,转换成16位字符,即0-F
私有静态字符串byteArrayToHexString(字节b[]) {
string buffer resultSb=new string buffer();
for(int I=0;长度;我)
resultsb . append(byteToHexString(b[I]));
返回resultsb . tostring();
}
//这里,对于单个字节,256的字节被16拆分成d1和d2
私有静态字符串byteToHexString(字节b) {
int n=b;
如果(n ^ 0)
n=256
int D1=n/16;
int d2=n % 16
返回hex digits[D1]hex digits[D2];
}
/**
* return capital MD5
*
* @param原点
* @param charsetname
* @返回
*/
私有静态字符串MD5Encode(String origin,String charsetname) {
String resultString=null
尝试{
resultString=新字符串(origin);
message digest MD=message digest . getinstance(' MD5 ');
if (charsetname==null || ' '。等于(字符集名))
resultString=byteArrayToHexString(MD . digest(resultString . getbytes()));
其他
resultString=byteArrayToHexString(MD . digest(resultString . getbytes(charset name)));
} catch(异常异常){
}
返回resultstring . toupper case();
}
公共静态字符串MD5EncodeUtf8(字符串来源){
origin=origin properties util . getproperty(' password . salt ',' ');
返回MD5Encode(origin,' utf-8 ');
}
私有静态最终字符串hexDigits[]={'0 ',' 1 ',' 2 ',' 3 ',' 4 ',' 5 ',
6 ',' 7 ',' 8 ',' 9 ',' a ',' b ',' c ',' d ',' e ',' f ' };
}
//这段代码中还引入了propertyseutil . getproperty(' password . salt ','')来获得一个额外的字符串,保证了碰撞算法的命中率更低,在第三方MD5平台上很难被搜索到。
password . salt=23543 fggeelysdafaqj 23 ou 89 zxcj @ # $ @ # $ # @ KJdjklj;D./dSF。
还有一个更详细的版本,对妇女和儿童有更详细的评论:
公共静态字符串stringMD5(字符串输入){
尝试{
//获取一个MD5转换器(如果您希望将SHA1参数更改为“SHA1”)
message digest message digest=message digest . getinstance(' MD5 ');
//输入字符串被转换为字节数组
byte[]inputByteArray=input . getbytes();
//inputByteArray是转换输入字符串得到的字节数组。
message digest . update(inputByteArray);
//转换并返回结果,也是16个元素的字节数组
byte[]result bytearray=message digest . digest();
//字符数组被转换成字符串并返回
返回byteArrayToHex(resultByteArray);
} catch(nosuch algorithm exception e){
返回null
}
}
下面的函数用于用十六进制字符串替换字节数组。
公共静态字符串byteArrayToHex(byte[]byteArray){
//首先初始化一个字符数组来存储每个十六进制字符。
char[] hexDigits={'0 ',' 1 ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ',' 9 ',' A ',' B ',' C ',' D ',' E ',' F ' };
//new一个字符数组,用来组成结果字符串(解释:一个字节是八位二进制,也就是两个十六进制字符(2的八次方等于16的二次方))
char[]resultCharArray=new char[bytearray . length * 2];
//遍历字节数组,通过位运算(位运算效率高),转换成字符,放入字符数组。
int index=0;
for(字节b:字节数组){
resultCharArray[index]=hex digits[b 40xf];
resultCharArray[index]=hex digits[b0xf];
}
//字符数组被组合成一个字符串并返回
返回新字符串(resultCharArray);
}
关于Java MD5加密的方法和示例代码的文章到此结束。有关Java MD5的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。