大家好,又见面了,我是你们的朋友全栈君。
本文博客原文
参考文章:
http://blog.sina.com.cn/s/blog_4f36423201000c1e.html
MessageDigest
类用于为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。简单点说就是用于生成
散列码。
信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。关于
信息摘要
和
散列码
请参照《
数字证书简介
》
MessageDigest 通过其getInstance系列静态函数来进行实例化和初始化。MessageDigest 对象通过使用 update
方法处理数据。任何时候都可以调用 reset
方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest
方法之一完成哈希计算并返回结果。
对于给定数量的更新数据,digest
方法只能被调用一次。digest
方法被调用后,MessageDigest 对象被重新设置成其初始状态。
MessageDigest 的实现可随意选择是否实现 Cloneable 接口。客户端应用程可以通过尝试复制和捕获 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)
MessageDigest . getInstance ( "SHA" );MessageDigest . getInstance ( "sha" );MessageDigest . getInstance ( "sHa" );
public static MessageDigest getInstance(String algorithm, String provider);
MessageDigest对象。因此,它不需要进一步的初始化。
MessageDigest
传送要计算的数据
MessageDigest对象提供传送要计算的数据。这将通过一次或多次调用以下某个
update(更新)方法来完成:
public void update ( byte input );public void update ( byte [] input );public void update ( byte [] input , int offset , int len );
MessageDigest对象
提传送要计算的数据后,你就可以调用以下某个 digest(摘要)方法来计算摘要(即
生成
散列码):
public byte [] digest ();public byte [] digest ( byte [] input );public int digest ( byte [] buf , int offset , int len );
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 ();}
public 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 blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.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 ,UnsupportedEncodingException {/*确定计算方法*/MessageDigest md5 = MessageDigest . getInstance ( "MD5" );BASE64Encoder base64en = new BASE64Encoder ();/*加密后的散列码字符串*/String strMd5 = base64en . encode ( md5 . digest ( text . getBytes ( "utf-8" )));return strMd5 ;}
String str = "0123456789"System . out . println ( md5sumWithEncoder ( str ));
3.4、示例三
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/147552.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...