大家好,又见面了,我是你们的朋友全栈君。
本文博客原
參考文章:
http://blog.sina.com.cn/s/blog_4f36423201000c1e.html
MessageDigest
类用于为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。简单点说就是用于生成
散列码。
信息摘要是安全的单向哈希函数,它接收随意大小的数据。输出固定长度的哈希值。关于信息摘要和散列码请參照《数字证书简单介绍》
MessageDigest 通过其getInstance系列静态函数来进行实例化和初始化。
MessageDigest 对象通过使用 update
方法处理数据。
不论什么时候都能够调用 reset
方法重置摘要。
一旦全部须要更新的数据都已经被更新了。应该调用 digest
方法之中的一个完毕哈希计算并返回结果。
对于给定数量的更新数据,digest
方法仅仅能被调用一次。digest
方法被调用后,MessageDigest 对象被又一次设置成其初始状态。
MessageDigest 的实现可任意选择是否实现 Cloneable 接口。client应用程能够通过尝试复制和捕获 CloneNotSupportedException 測试可复制性:
MessageDigest md = MessageDigest.getInstance(“SHA”);
try {
md.update(toChapter1);
MessageDigest tc1 = md.clone();
byte[] toChapter1Digest = tc1.digest();
md.update(toChapter2);
…etc.
} catch (CloneNotSupportedException cnse) {
throw new DigestException(“couldn’t make digest of partial content”);
}
注意1:即时给定MessageDigest的实现是不可复制的。则仍然可以通过getInstance方法实例化几个实例计算来同一时候进行摘要信息的计算。
注意2:因为历史原因,此类是抽象的,是从 MessageDigestSpi
扩展的。应用程序开发者仅仅应该注意在此 MessageDigest
类中定义的方法;超类中的全部方法是供希望提供自己的信息摘要算法实现的加密服务提供者使用的。
注意3:MessageDigest并非单实例的。例如以下代码所看到的:
try
{
MessageDigest mdTemp1 = MessageDigest.getInstance(“MD5”);
MessageDigest mdTemp2= MessageDigest.getInstance(“MD5”);
MessageDigest mdTemp3= MessageDigest.getInstance(“MD5”);
System.out.println(“mdTemp1==mdTemp2?
:”+(mdTemp1==mdTemp2));
System.out.println(“mdTemp2==mdTemp3?
:”+(mdTemp2==mdTemp3));
} catch (NoSuchAlgorithmException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
执行结果
mdTemp1==mdTemp2?:false
mdTemp2==mdTemp3?:false
构造方法摘要 | |
---|---|
protected |
MessageDigest(String algorithm) 创建具有指定算法名称的MessageDigest 实例对象。 |
方法摘要 | |
---|---|
Object |
clone() 假设实现是可复制的,则返回一个副本。 |
byte[] |
digest() 通过运行诸如填充之类的终于操作完毕哈希计算。 |
byte[] |
digest(byte[] input) 使用指定的字节数组对摘要进行最后更新。然后完毕摘要计算。 |
int |
digest(byte[] buf, int offset, int len) 通过运行诸如填充之类的终于操作完毕哈希计算。 |
String |
getAlgorithm() 返回标识算法的独立于实现细节的字符串。 |
int |
getDigestLength() 返回以字节为单位的摘要长度,假设提供程序不支持此操作而且实现是不可复制的。则返回 0。 |
static MessageDigest |
getInstance(String algorithm) 生成实现指定摘要算法的 MessageDigest 对象。 |
static MessageDigest |
getInstance(String algorithm, Provider provider) 生成实现指定提供程序提供的指定算法的 MessageDigest 对象,假设该算法可从指定的提供程序得到的话。 |
static MessageDigest |
getInstance(String algorithm, String provider) 生成实现指定提供程序提供的指定算法的 MessageDigest 对象,假设该算法可从指定的提供程序得到的话。 |
Provider |
getProvider() 返回此信息摘要对象的提供程序。 |
static boolean |
isEqual(byte[] digesta, byte[] digestb) 比較两个摘要的相等性。 |
void |
reset() 重置摘要以供再次使用。 |
String |
toString() 返回此信息摘要对象的字符串表示形式。 |
void |
update(byte input) 使用指定的字节更新摘要。 |
void |
update(byte[] input) 使用指定的字节数组更新摘要。 |
void |
update(byte[] input, int offset, int len) 使用指定的字节数组,从指定的偏移量開始更新摘要。 |
void |
update(ByteBuffer input) 使用指定的 ByteBuffer 更新摘要。 |
MessageDigest
对象
散列码
)要做的第一步是创建
MessageDigest
对象
实例。像全部的引擎类一样,获取某类报文摘要算法(即
散列算法
,比方
MD5
)的
MessageDigest
对象的途径是调用
MessageDigest
类中的
getInstance
静态
factory
方法:
public static MessageDigest getInstance(String algorithm)
比如,下面全部调用都是相等的:
.
getInstance
(
“SHA”
);
.
getInstance
(
“sha”
);
.
getInstance
(
“sHa”
);
public static MessageDigest getInstance(String algorithm, String provider);
MessageDigest对象。因此,它不须要进一步的初始化。
MessageDigest
传送要计算的数据
MessageDigest对象提供传送要计算的数据。这将通过一次或多次调用下面某个
update(更新)方法来完毕:
void
update
(
byte
input
);
void
update
(
byte
[]
input
);
void
update
(
byte
[]
input
,
int
offset
,
int
len
);
MessageDigest对象
提传送要计算的数据后,你就能够调用下面某个 digest(摘要)方法来计算摘要(即
生成
散列码):
byte
[]
digest
();
byte
[]
digest
(
byte
[]
input
);
int
digest
(
byte
[]
buf
,
int
offset
,
int
len
);
该方法返回实际存储在 buf 中的字节数。
public void update(byte[] input)
三、样例演示
MessageDigest类提供了计算消息摘要
(
即生成
散列码
)的方法。首先生成对象,运行其
update( )方法可
digest( )方法就可以得到消息摘要。详细过程例如以下:
MessageDigest m=MessageDigest.getInstance(“MD5”);
getInstance( )生成
MessageDigest对象。
MD5“,”
SHA“等。
m.update(x.getBytes(“UTF8” ));
byte s[ ]=m.digest( );
static
String
convertToHexString
(
byte
data
[])
{
StringBuffer
strBuffer
=
new
StringBuffer
();
for
(
int
i
=
0
;
i
<
data
.
length
;
i
++)
{
strBuffer
.
append
(
Integer
.
toHexString
(
0xff
&
data
[
i
]));
}
return
strBuffer
.
toString
();
}
class
MessageDigestDemo
extends
Thread
{
public
void
run
()
{
String
text
=
“abc”
;
byte
data
[]
=
null
;
MessageDigest
m
;
try
{
data
=
text
.
getBytes
(
“UTF8”
);
m
=
MessageDigest
.
getInstance
(
“MD5”
);
m
.
update
(
data
);
byte
resultData
[]
=
m
.
digest
();
System
.
out
.
println
(
convertToHexString
(
resultData
));
}
catch
(
NoSuchAlgorithmException
e
)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static
String
convertToHexString
(
byte
data
[])
{
StringBuffer
strBuffer
=
new
StringBuffer
();
for
(
int
i
=
0
;
i
<
data
.
length
;
i
++)
{
strBuffer
.
append
(
Integer
.
toHexString
(
0xff
&
data
[
i
]));
}
return
strBuffer
.
toString
();
}
900150983cd24fb0d6963f7d28e17f72
sun.misc.BASE64Encoder进行简单的加密。
public
String
md5sumWithEncoder
(
String
text
)
throws
NoSuchAlgorithmException
,
{
/*确定计算方法*/
MessageDigest
md5
=
MessageDigest
.
getInstance
(
“MD5”
);
=
new
BASE64Encoder
();
/*加密后的散列码字符串*/
String
strMd5
=
base64en
.
encode
(
md5
.
digest
(
text
.
getBytes
(
“utf-8”
)));
return
strMd5
;
}
str
=
“0123456789”
System
.
out
.
println
(
md5sumWithEncoder
(
str
));
3.4、演示样例三
转载于:https://www.cnblogs.com/mfrbuaa/p/4585387.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148480.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...