`

认识java.security.MessageDigest 类

    博客分类:
  • Java
阅读更多

Java 加密技术:消息摘要。

一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。

消息摘要有两个基本属性:

两个不同的报文难以生成相同的摘要
难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要
代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5


类 java.security.MessageDigest

java.lang.Object
   |
   +----java.security.MessageDigest

public abstract class MessageDigest
extends Object

MessageDigest 提供了消息摘要算法,如 MD5 或 SHA,的功能。消息摘要是安全单向散列函数,它采用任意大小的数据并输出一个固定长度的散列值。

象 Java 安全性中的其它基于算法的类一样,MessageDigest 有两个主要的组件:

消息摘要 API ( 应用程序接口 )
这是需要消息摘要服务的应用调用的方法的接口。这个 API 由所有公有方法组成。
消息摘要 SPI ( 服务提供者接口 )
该接口是由提供特殊算法的提供者实现的接口。它由所有名字前缀为 engine 的方法组成。每个这样的方法由具有相应名字的公有 API 方法调用。例如,engineReset 方法由 reset 方法调用。SPI 方法是抽象的;提供者必须提供一个具体的实现。

MessageDigest 对象在启动时被初始化。使用 update 方法处理数据。在任何地方都可调用 reset 复位摘要。一旦所有需要修改的数据都被修改了,将调用一个 digest 方法完成散列码的计算。

对于给定次数的修改,只能调用 digest 方法一次。在调用 digest 之后,MessageDigest 对象被复位为初始化的状态。

可以自由的实现 Cloneable 接口,这样做将会使客户应用在复制前用 instanceof Cloneable 测试可复制性:

 

 MessageDigest md = MessageDigest.getInstance("SHA");
 if (md instanceof Cloneable) {
     md.update(toChapter1);
     MessageDigest tc1 = md.clone();
     byte[] toChapter1Digest = tc1.digest;
     md.update(toChapter2);
     ...etc.
 } else {
     throw new DigestException("couldn't make digest of partial content");
 }
 

注意如果给定的实现是不可复制的,如果事先知道摘要的数目,仍然能以几个实例为例计算中间的摘要。

构造子

MessageDigest

 protected MessageDigest(String algorithm)
用指定的算法名创建一个消息摘要。

 

参数:
algorithm - 摘要算法的标准字符串名。 Java 密码结构 API 说明书 & 参考 的附录 A。 -->

方法

getInstance

 public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
生成一个 MessageDigest 对象,它实现指定的摘要算法。 如果缺省的提供者包包含一个实现了该算法 MessageDigest 子类,则返回该子类的一个实例。如果算法在缺省包中是不可用的,将搜索其它的包。

 

参数:
algorithm - 申请的算法名。 Java 密码结构 API 说明书 & 参考 的附录 A。 -->
返回值:
一个实现指定算法的 Message Digest 对象。
抛出: NoSuchAlgorithmException
如果算法在调用者环境中是不可用的。

getInstance

 public static MessageDigest getInstance(String algorithm,
String provider) throws
NoSuchAlgorithmException,
NoSuchProviderException
生成一个 MessageDigest 对象,实现指定的算法,如果提供者的算法是可用的,那么该算法由该提供者提供。

 

参数:
algorithm - 申请的算法名。 Java 密码结构 API 说明书 & 参考 的附录 A。 -->
provider - 提供者的名字。
返回值:
一个实现指定算法的 Message Digest 对象。
抛出: NoSuchAlgorithmException
如果算法在申请的调用者提供的包中是不可用的。
抛出: NoSuchProviderException
如果提供者在环境中是不可用的。
参见:
Provider

update

 public void update(byte input)
用指定的字节修改该摘要。

 

参数:
input - 用于修改摘要的字节。

update

 public void update(byte input[],
               int offset,
                       int len)
从数组指定的偏移量开始,用指定的字节数组修改摘要。

 

参数:
input - 该字节数组。
offset - 字节数组中开始的偏移量。
len - 从 offset 开始用的字节数。

update

 public void update(byte input[])
用指定的字节数组修改该摘要。

 

参数:
input - 该字节数组。

digest

 public byte[] digest()
通过执行最后的诸如填充的操作完成散列码的计算。 在调用之后复位该摘要。

 

返回值:
存放结果散列值的字节数组。

digest

 public byte[] digest(byte input[])
使用指定的字节数组执行对摘要最后的修改,然后完成摘要计算。 即,这个方法首先对数组调用 update,然后调用 digest()

 

参数:
input - 在摘要计算完成之前用于修改的输入值。
返回值:
结果散列值的字节数组。

toString

 public String toString()
返回该消息摘要对象的字符串表示。

 

覆盖:
Object 中的 toString

isEqual

 public static boolean isEqual(byte digesta[],
                               byte digestb[])
比较两个摘要是否相同。 进行简单的比较。

 

参数:
digesta - 要比较的一个摘要。
digestb - 要比较的另一个摘要。
返回值:
如果两个摘要相等则为 true ,否则为 false。

reset

 public void reset()
为将来的使用复位该摘要。

一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。

消息摘要有两个基本属性:

两个不同的报文难以生成相同的摘要
难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要
代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5.

消息摘要MD5和SHA的使用
使用方法:

首先用生成一个MessageDigest类,确定计算方法

java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");

添加要进行计算摘要的信息

alga.update(myinfo.getBytes());

计算出摘要

byte[] digesta=alga.digest();

发送给其他人你的信息和摘要

其他人用相同的方法初始化,添加信息,最后进行比较摘要是否相同

algb.isEqual(digesta,algb.digest())

相关AIP

java.security.MessageDigest 类

static getInstance(String algorithm)

返回一个MessageDigest对象,它实现指定的算法

参数:算法名,如 SHA-1 或MD5

void update (byte input)

void update (byte[] input)

void update(byte[] input, int offset, int len)

添加要进行计算摘要的信息

byte[] digest()

完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位)

void reset()

复位

static boolean isEqual(byte[] digesta, byte[] digestb)

比效两个摘要是否相同

代码:
import java.security.*;

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

myDigest my = new myDigest();
my.testDigest();
}

public void testDigest() {
try {
String myinfo = "我的测试信息";

// java.security.MessageDigest
// alg=java.security.MessageDigest.getInstance("MD5");
java.security.MessageDigest alga = java.security.MessageDigest
.getInstance("SHA-1");
alga.update(myinfo.getBytes());
byte[] digesta = alga.digest();
System.out.println("本信息摘要是:" + byte2hex(digesta));
// 通过某种方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
java.security.MessageDigest algb = java.security.MessageDigest
.getInstance("SHA-1");
algb.update(myinfo.getBytes());
if (algb.isEqual(digesta, algb.digest())) {
System.out.println("信息检查正常");
} else {
System.out.println("摘要不相同");
}

} catch (java.security.NoSuchAlgorithmException ex) {
System.out.println("非法摘要算法");
}

}

public String byte2hex(byte[] b) // 二行制转字符串
{
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}

return hs.toUpperCase();
}

}

b[n] & 0XFF 的作用是将byte转化为int

因为0xff是整型, byte[] b; b[index] & 0xff 向大的数据类型靠拢,就是整型了。

java中的byte sign ,所以 将一个负byte强制转换成int,就会损坏原来的binary表示,例如:
byte bb=(byte) 0xf1; //11110001
printBinary((int)bb);//11111111111111111111111111110001

printBinary(bb & 0xff);//00000000000000000000000011110001

运行结果:

int: -15 binary:

11111111111111111111111111110001

int: 241 binary:

00000000000000000000000011110001

 

分享到:
评论
1 楼 l895086793 2011-03-25  
aaaaaaaa

相关推荐

    Java 2平台安全技术-结构,API设计和实现

    7.3.3 java.security.MessageDigest 122 7.3.4 java.security.Signature 123 7.3.5 算法参数 124 7.3.6 java.security.Key和java.security. spec.KeySpec 126 7.3.7 java.security.KeyFactory和java. security....

    java_security

    Java中,可以使用`java.security.MessageDigest`类的`getInstance`方法获取MD5实例,然后对数据进行处理,得到散列值。 SHA(Secure Hash Algorithm)系列,包括SHA-1和SHA-256等,同样是单向散列函数,提供更强的...

    各种java加密算法工具类

    在提供的`SecurityUtil.java`文件中,很可能是将这些加密算法封装成了一个工具类,便于在项目中统一调用。这个工具类可能包含了对MD5和RSA的多种功能,如字符串的MD5哈希计算、RSA密钥对的生成、数据的加密和解密等...

    java密码加密

    例如,在Java中,我们可以使用`java.security.MessageDigest`类来实现MD5和SHA1的加密: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public String ...

    MD5_java.rar_MD5 JAVA_java md5_md5_md5算法

    在这个例子中,`getMD5`方法接收一个字符串,使用`MessageDigest.getInstance("MD5")`创建一个MD5实例,然后对输入字符串的字节进行哈希处理。得到的结果是一个字节数组,接着通过`String.format("%02x", 0xFF & b)`...

    JAVA 2平台安全技术-结构,API设计和实现

    7.3.3 java.security.MessageDigest 122 7.3.4 java.security.Signature 123 7.3.5 算法参数 124 7.3.6 java.security.Key和java.security. spec.KeySpec 126 7.3.7 java.security.KeyFactory和java. security....

    md5_new.rar_MD5 JAVA_java md5_md5_加密算法

    在提供的压缩包中,有一个名为`MD5.java`的文件,很可能包含了上述的Java代码实现。另一个文件`www.pudn.com.txt`可能是用来测试MD5加密的输入文本,通过这个文本,你可以运行MD5加密程序并验证其正确性。 MD5虽然...

    SHA-1-Java.rar_SHA1_java 算法_java文件指纹

    在Java中实现SHA-1算法,可以使用`java.security.MessageDigest`类。首先,需要实例化一个`MessageDigest`对象,并指定使用SHA-1算法。然后,用`update()`方法分批或者一次性地将文件内容输入到哈希函数中。最后,...

    java-util大全.rar

    Java的`java.security.MessageDigest`类可以生成MD5摘要,常用于数据校验和密码存储。 8. **FastDfs文件服务器**: FastDFS是一个开源的高性能、轻量级的分布式文件系统,Java客户端可以用来上传、下载文件,处理...

    MD5和RSA加密算法Java完成实现

    MessageDigest md = MessageDigest.getInstance("MD5"); byte[] messageDigest = md.digest(input.getBytes()); StringBuilder hexString = new StringBuilder(); for (byte b : messageDigest) { hexString....

    java_md5加密源码

    在压缩包中的`MD5.java`文件可能包含一个完整的Java类,用于实现上述MD5加密功能。这个类可能有一个静态方法,接收字符串作为参数,返回MD5加密后的字符串。例如: ```java public class MD5 { public static ...

    SHA-256(JAVA)

    在JAVA中,我们可以利用`java.security.MessageDigest`类来实现SHA-256加密。首先,我们需要创建一个`MessageDigest`实例,指定为SHA-256算法。然后,将要加密的数据分块送入`update`方法,最后调用`digest`方法获取...

    MD5加密java和android通用

    在Java中,MD5加密通常通过`java.security.MessageDigest`类实现。以下是一个简单的Java MD5加密示例: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public ...

    Java常用工具类.zip

    Java标准库中的`java.security.MessageDigest`类可以用来生成MD5摘要,适用于密码存储等场景。 6. **FTP传输工具类**:FTP(文件传输协议)用于在网络上进行文件传输。Java的`java.net.Socket`和`java.io`包可以...

    JavaSecuritySolutions

    7. **数据完整性(Data Integrity)**:`java.security.MessageDigest`类用于计算哈希值,确保数据未被篡改。MD5和SHA家族的算法常用于此目的。 8. **网络安全(Network Security)**:Java的`java.net`包支持SSL/...

    单向加密算法的Java实现

    在Java中,可以使用`java.security.MessageDigest`类来实现MD5加密: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Example { public static ...

    Java加密技术详解(参考文档)

    public class HashUtil { public static String sha256(String data) throws NoSuchAlgorithmException { MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] hashBytes = messageDigest

    java数据加密.pdf

    在Java中,`java.security.KeyPairGenerator`和`java.security.Signature`类可以用来生成RSA密钥对并进行签名操作。 总结起来,Java提供了丰富的加密和安全功能,涵盖了消息摘要、对称加密(如AES)和非对称加密...

    JAVA MD5加密例子

    在Java中,我们可以利用`java.security.MessageDigest`类来实现MD5加密。下面我们将详细介绍MD5加密在Java中的应用及其原理。 MD5算法的基本思想是将任意长度的输入(又叫做预映射pre-image)通过一系列的数学运算...

    用Java加密类实现DES、RSA及SHA的加密算法

    MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(plaintext.getBytes()); ``` 在实际开发中,为了提高安全性,通常会结合使用多种加密算法,例如使用RSA进行密钥交换,...

Global site tag (gtag.js) - Google Analytics