Java 加密技术:消息摘要。
一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。
消息摘要有两个基本属性:
两个不同的报文难以生成相同的摘要
难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要
代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5
类 java.security.MessageDigest
java.lang.Object | +----java.security.MessageDigest
MessageDigest 提供了消息摘要算法,如 MD5 或 SHA,的功能。消息摘要是安全单向散列函数,它采用任意大小的数据并输出一个固定长度的散列值。
象 Java 安全性中的其它基于算法的类一样,MessageDigest 有两个主要的组件:
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)
方法
getInstance
public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
getInstance
public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
update
public void update(byte input)
update
public void update(byte input[], int offset, int len)
offset
开始用的字节数。 update
public void update(byte input[])
digest
public byte[] digest()
digest
public byte[] digest(byte input[])
toString
public String toString()
isEqual
public static boolean isEqual(byte digesta[], byte digestb[])
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
发表评论
-
认识java.lang.Class类
2007-05-07 19:55 1343一. Class类 1. Class对象描述了运行中的clas ... -
认识java.lang.ThreadLocal类
2007-05-07 19:51 2801早在Java 1.2推出之时,Java平台中就引入了一个新的支 ... -
如何把 java 程序编译成 .exe 文件
2007-05-01 02:15 2405常常在网 ... -
开发webservice应用程序
2007-05-01 02:13 1382随着Internet/Intranet的发展,开发模式发生了变 ... -
JSP中include指令和include行为区别
2007-05-01 02:12 1546我们都知道在jsp中include有两种形式,分别是 < ... -
使用javamail发信过程中的一些问题及解决方法
2007-05-01 02:11 10839今天在研究javamail发信 ... -
java中的时间操作
2007-05-01 02:10 1486java中的时间操作不外乎这四种情况: 1、获取当前时间 ... -
java实现精确的四舍五入
2007-05-01 02:09 1166java 代码 import java.math ... -
JAVA常用超类
2007-05-01 01:58 1298java 代码 package com.wide ... -
JAVA常用连接数据库关闭数据库等类
2007-05-01 01:56 2841java 代码 package com.wide ... -
JAVA中转换HTML代码
2007-05-01 01:54 1172java 代码 package com.wide ...
相关推荐
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中,可以使用`java.security.MessageDigest`类的`getInstance`方法获取MD5实例,然后对数据进行处理,得到散列值。 SHA(Secure Hash Algorithm)系列,包括SHA-1和SHA-256等,同样是单向散列函数,提供更强的...
在提供的`SecurityUtil.java`文件中,很可能是将这些加密算法封装成了一个工具类,便于在项目中统一调用。这个工具类可能包含了对MD5和RSA的多种功能,如字符串的MD5哈希计算、RSA密钥对的生成、数据的加密和解密等...
例如,在Java中,我们可以使用`java.security.MessageDigest`类来实现MD5和SHA1的加密: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public String ...
在这个例子中,`getMD5`方法接收一个字符串,使用`MessageDigest.getInstance("MD5")`创建一个MD5实例,然后对输入字符串的字节进行哈希处理。得到的结果是一个字节数组,接着通过`String.format("%02x", 0xFF & b)`...
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.java`的文件,很可能包含了上述的Java代码实现。另一个文件`www.pudn.com.txt`可能是用来测试MD5加密的输入文本,通过这个文本,你可以运行MD5加密程序并验证其正确性。 MD5虽然...
在Java中实现SHA-1算法,可以使用`java.security.MessageDigest`类。首先,需要实例化一个`MessageDigest`对象,并指定使用SHA-1算法。然后,用`update()`方法分批或者一次性地将文件内容输入到哈希函数中。最后,...
Java的`java.security.MessageDigest`类可以生成MD5摘要,常用于数据校验和密码存储。 8. **FastDfs文件服务器**: FastDFS是一个开源的高性能、轻量级的分布式文件系统,Java客户端可以用来上传、下载文件,处理...
MessageDigest md = MessageDigest.getInstance("MD5"); byte[] messageDigest = md.digest(input.getBytes()); StringBuilder hexString = new StringBuilder(); for (byte b : messageDigest) { hexString....
在压缩包中的`MD5.java`文件可能包含一个完整的Java类,用于实现上述MD5加密功能。这个类可能有一个静态方法,接收字符串作为参数,返回MD5加密后的字符串。例如: ```java public class MD5 { public static ...
在JAVA中,我们可以利用`java.security.MessageDigest`类来实现SHA-256加密。首先,我们需要创建一个`MessageDigest`实例,指定为SHA-256算法。然后,将要加密的数据分块送入`update`方法,最后调用`digest`方法获取...
在Java中,MD5加密通常通过`java.security.MessageDigest`类实现。以下是一个简单的Java MD5加密示例: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public ...
Java标准库中的`java.security.MessageDigest`类可以用来生成MD5摘要,适用于密码存储等场景。 6. **FTP传输工具类**:FTP(文件传输协议)用于在网络上进行文件传输。Java的`java.net.Socket`和`java.io`包可以...
7. **数据完整性(Data Integrity)**:`java.security.MessageDigest`类用于计算哈希值,确保数据未被篡改。MD5和SHA家族的算法常用于此目的。 8. **网络安全(Network Security)**:Java的`java.net`包支持SSL/...
在Java中,可以使用`java.security.MessageDigest`类来实现MD5加密: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Example { public static ...
public class HashUtil { public static String sha256(String data) throws NoSuchAlgorithmException { MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] hashBytes = messageDigest
在Java中,`java.security.KeyPairGenerator`和`java.security.Signature`类可以用来生成RSA密钥对并进行签名操作。 总结起来,Java提供了丰富的加密和安全功能,涵盖了消息摘要、对称加密(如AES)和非对称加密...
在Java中,我们可以利用`java.security.MessageDigest`类来实现MD5加密。下面我们将详细介绍MD5加密在Java中的应用及其原理。 MD5算法的基本思想是将任意长度的输入(又叫做预映射pre-image)通过一系列的数学运算...
MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(plaintext.getBytes()); ``` 在实际开发中,为了提高安全性,通常会结合使用多种加密算法,例如使用RSA进行密钥交换,...