- 浏览: 25913 次
文章分类
最新评论
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) throwsNoSuchAlgorithmException, 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
http://blog.sina.com.cn/s/blog_82342ce20100vjxp.html
发表评论
-
NIO IO区别
2014-01-07 16:12 655转载一篇 我的新书《代码之谜》会有专门的章节 ... -
Spring集成Quartz定时任务框架介绍和Cron表达式详解
2013-01-16 09:25 761在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生 ... -
ClassLoader 与 class
2012-07-03 15:09 1067ClassLoader一个经常出现又让很多人望而却步的词,本文 ... -
转载一篇Java Properties
2012-06-11 18:19 761http://tech.techweb.com.cn/thre ... -
java 线程
2012-05-23 18:07 790http://zhidao.baidu.com/questio ... -
java 并发学习
2012-05-23 11:04 757http://snake1987.iteye.com/blog ... -
java事物总结
2012-05-20 13:19 4297事务处理总结 来源 ... -
md5加密算法
2012-05-20 13:13 845以下是搜索网上的资料所谓MD5,即"Message- ... -
Class.forName与DriverManager区别
2012-05-17 08:52 6519在学习JDBC的时候,通常有两种方式去注册数据库驱动程序(这里 ...
相关推荐
通过上述分析,我们可以看到Java中使用MessageDigest实现MD5加密的基本过程。这种方法简洁高效,适合用于简单的应用场景。然而,在涉及敏感数据或高安全性的场景下,应考虑采用更强大的加密算法以提高系统的安全性。
Java语言也提供了对MD5的支持,其内置的`java.security.MessageDigest`类可以方便地进行MD5加密。使用Java进行MD5加密的步骤大致如下: 1. 引入`java.security.MessageDigest`类库。 2. 创建`MessageDigest`实例,...
在Servlet中使用MD5加密不仅可以提高数据的安全性,还可以有效防止数据泄露。然而,值得注意的是,虽然MD5算法在许多情况下足够安全,但它已被证明存在一定的碰撞风险,即不同的输入可能产生相同的散列值。因此,在...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,主要目的是为了产生一个固定长度的摘要,用于表示原始数据。在IT行业中,MD5主要用于数据校验、密码存储和文件完整性验证等方面。MD5加密jar包是将MD5...
在提供的压缩包文件“MD5”中,可能包含了一个Java程序示例,演示了如何使用MD5加密并生成32位小写的哈希值。这个程序可以作为一个基础模板,帮助开发者快速集成MD5功能到自己的项目中。 总之,MD5是一种便捷的哈希...
在编程实践中,MD5的实现通常涉及特定的库函数,例如在Python中可以使用`hashlib`库,Java中可以使用`java.security.MessageDigest`类,JavaScript中则有`crypto`模块。这些库提供了简单的API,让开发者能够方便地...
这个压缩包可能包含了一个主程序,用于演示如何使用MD5进行加密操作。主程序通常会包含读取输入字符串,初始化`MessageDigest`对象,调用`digest()`方法计算哈希,然后将结果转换成16进制字符串展示给用户。 4. **...
在Java中,可以使用`java.security.MessageDigest`类来实现MD5加密。首先创建`MessageDigest`实例,然后调用`digest()`方法对数据进行加密。例如: ```java import java.security.MessageDigest; import java....
在Android中,我们可以使用Java内置的`java.security.MessageDigest`类来实现MD5加密。以下是一个简单的MD5加密步骤: 1. 创建`MessageDigest`实例,指定算法为MD5。 ```java MessageDigest md = MessageDigest....
java与c#MD5加密方法得到不一致解决办法,MD5加密后得到不一致结果
1. **MD5加密jar包**:这些预编译的库可能包含了实现MD5加密功能的Java类和方法,比如`java.security.MessageDigest`类的使用,它可以用来创建MD5实例并进行哈希运算。使用这些jar包,开发者可以直接调用API进行MD5...
但是,题目中提到的"36位MD5加密字符"可能是指将32位的MD5值转换为特定格式,例如每8位用一个分隔符分隔,或者使用非十六进制字符来表示。在Java中,我们可以使用`java.security.MessageDigest`类来计算MD5哈希。 ...
纯JAVA的MD5加密,利用MD5单向函数产生密钥,方便测试
在这个例子中,`calculateMD5`方法接受一个字节数组,直接调用`MessageDigest`的`update`和`digest`方法完成MD5加密。 在JSP中使用这个类,可以将用户名或密码先转换成字节数组,然后调用`MD5Digest.md5crypt`或`MD...
- **getMD5 方法**:该方法接收一个`File`对象作为参数,通过`MessageDigest.getInstance("MD5")`获取MD5算法实例,然后使用`FileInputStream`读取文件内容。读取时采用缓冲机制提高效率,每读取一部分数据就调用`...
php md5加密php md5加密php md5加密php md5加密
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,主要应用于数据的校验和加密场景。在IT行业中,MD5常被用来确保数据的完整性和安全性,尤其是在存储密码时,通常会将原始密码转化为MD5哈希值进行存储...
### Android MD5加密详解 #### 一、MD5算法简介 MD5(Message-Digest ...总之,在Android应用开发中,合理使用MD5加密可以有效提升应用的安全性,但在实际应用中也要注意其局限性,结合具体需求选择合适的加密策略。
MD5(Message-Digest Algorithm 5)是一种广泛应用于信息...综上所述,JAVA中的MD5加密涉及到MD5算法的基本原理、JAVA API的使用以及加密过程。在实际应用中,了解其局限性并考虑使用更安全的替代方案是十分重要的。