Java安全之消息摘要
来源:互联网 发布:软件安全性认识 编辑:程序博客网 时间:2024/05/22 17:10
消息摘要又称数据指纹,主要用于数据的完整性校验,例如当你在apache下载一个jar包的时候,在下载列表中除了会提供下载链接,还会提供MD5摘要值,当你在下载完成后再对下载的文件计算摘要值,如果摘要值一致,则说明下载过程中没有发生数据丢失或更改,确保数据完整。
消息摘要的算法主要包含MD(Message Digest)、SHA(Secure Hash Algorithm)和MAC(Message Authentication Code)共3大系列,也是数据签名的核心算法。MD系列包含MD2,MD4,MD5共三种算法,其中MD5最常用也最完善;SHA算法主要包含SHA-1、SHA-224、SHA-256、、SHA-384、SHA-512等,其中SHA-1最常用;MAC算法综合了上述两种算法,主要包括HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512等,MAC算法综合MD5与SHA算法的优势,并加入了密钥的支持,是一种更为安全的消息摘要算法。
二、MAC系列
消息摘要的算法主要包含MD(Message Digest)、SHA(Secure Hash Algorithm)和MAC(Message Authentication Code)共3大系列,也是数据签名的核心算法。MD系列包含MD2,MD4,MD5共三种算法,其中MD5最常用也最完善;SHA算法主要包含SHA-1、SHA-224、SHA-256、、SHA-384、SHA-512等,其中SHA-1最常用;MAC算法综合了上述两种算法,主要包括HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512等,MAC算法综合MD5与SHA算法的优势,并加入了密钥的支持,是一种更为安全的消息摘要算法。
在应用程序中主要是为数据计算消息摘要与校验消息摘要,下面就看看在Java中是如何使用的,其入口类也称为引擎类为:java.security.MessageDigest但使用MAC算法时引擎类为:javax.crypto.Mac。
一、MD与SHA系列
public class DigestTest {@Testpublic void test() throws Exception {String myInfo = "我的测试信息";//参数为消息摘要算法,在Java中默认支持的算法有:MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512MessageDigest digest = MessageDigest.getInstance("SHA-1");//更新待计算摘要的数据,该方法可以调用多次,例如一个文件很大,需要分多次更新digest.update(myInfo.getBytes());//得到摘要结果byte[] result = digest.digest();//摘要其实是一段二进制数据,但为了方便人们查看,一般会将其用16进制字符串表示System.out.println("本信息摘要为:" + toHexString(result));MessageDigest md = MessageDigest.getInstance("SHA-1");md.update(myInfo.getBytes());//isEqual方法用于判断两摘要值是否一致if(MessageDigest.isEqual(result, md.digest())) {System.out.println("摘要检查正常");} else {System.out.println("非法摘要");}}// 二行制数据转为16进制字符串public static String toHexString(byte[] data) {StringBuilder builder = new StringBuilder();String stmp = "";for (int n = 0; n < data.length; n++) {stmp = (java.lang.Integer.toHexString(data[n] & 0XFF));if (stmp.length() == 1) {builder.append("0");}builder.append(stmp);}return builder.toString().toUpperCase();}@Testpublic void testDigestInputStream() throws Exception {MessageDigest digest = MessageDigest.getInstance("MD5");String value = "xtayfjpk";byte[] bytes = value.getBytes();//还可以使用DigestInputStream来自动计算消息摘要,只要是从DigestInputStream流中读取的数据,//都会更新到MessageDigest中,相当于间接调用了MessageDigest的update方法DigestInputStream stream = new DigestInputStream(new ByteArrayInputStream(bytes), digest);//一定要开启,默认为开启stream.on(true);stream.read(bytes);byte[] result = stream.getMessageDigest().digest();System.out.println(toHexString(result));stream.close();}@Testpublic void testDigestOutStream() throws Exception {MessageDigest digest = MessageDigest.getInstance("MD5");String value = "xtayfjpk";byte[] bytes = value.getBytes();ByteArrayOutputStream baos = new ByteArrayOutputStream();//与DigestInputStream相似,只不过使用DigestOutputStream时是从其流出的数据都会更新到MessageDigest中DigestOutputStream stream = new DigestOutputStream(baos, digest);//一定要开启,默认为开启stream.on(true);stream.write(bytes);byte[] result = stream.getMessageDigest().digest();System.out.println(SecurityUtils.toHexString(result));stream.close();}}
二、MAC系列
@Testpublic void testMac() throws Exception {String myInfo = "我的测试信息";Mac digest = Mac.getInstance("HmacSHA512");//获取密钥生成器,AES为密钥算法KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");//用生成的密钥进行初始化digest.init(keyGenerator.generateKey());//更新待计算摘要数据digest.update(myInfo.getBytes());//得到摘要结果byte[] result = digest.doFinal();System.out.println("本信息摘要为:" + toHexString(result));}
0 0
- Java安全之消息摘要
- Java安全之消息摘要
- Java安全之消息摘要算法
- [Java 安全]消息摘要与数字签名
- [Java 安全]消息摘要与数字签名
- [Java 安全]消息摘要与数字签名
- java 加密之消息摘要算法
- Java加密解密之消息摘要
- Java安全学习笔记(五)-计算消息摘要
- Java安全学习笔记(六)-使用消息摘要验证口令
- java安全-----摘要
- JAVA消息摘要用处
- Java Md5 消息摘要
- java消息摘要
- JAVA消息摘要
- Java消息摘要算法
- Java加密系列之(三)消息摘要算法加密
- JAVA加密解密之消息摘要算法(MessageDigest)
- Shiro架构介绍
- 解决 eclispe 保存 java 源码时自动格式问题
- 怎么轻松的把pdf文档转为Excel
- 点击动画弹出指定位置的dialog
- 让UITableView响应touch事件
- Java安全之消息摘要
- spring MVC之用Handler Interceptor拦截请求
- Delphi XE8 及 C++Builder XE8 中文手册即将上市
- Ubuntu 12.04安装rabbitmq
- Linux(Ubuntu)下使用vsftpd搭建ftp服务器
- 黑马程序员----OC常用集合类
- SharePoint 2013 集成嵌入 BI工具 DataZen
- 136A - Presents
- View的位置