信息摘要技术
来源:互联网 发布:apk 反编译 拿到源码 编辑:程序博客网 时间:2024/04/28 00:28
MD算法是信息摘要三大算法中场景的一种,全称:Message Digest算法,按照规范版本分为MD2、MD4、MD5三种算法,目前最常用的是MD5版本算法。
MD家族发展历史
- 1989年,RSA发明人开发了MD2算法:
- 1.对信息进行补位,信息的字节长度为16的倍数;
- 2.以一个16位的校验和,追加到信息末尾;
- 3.根据新的信息产生一个128位的散列值,得出MD2值;
- 1990年,在MD2基础上发展出MD4算法:
- 1.和MD2一样,仍然对信息进行补位,但是补位时要添加448个字节,变为 512的倍数;
- 2.仍对信息做散列,获取一个128位的散列值,得出MD4值;
- MD4的算法影响很大,比如MD5、SHA-1、Ripe-MD系列都是从MD4基础上衍生出来的;
- 1991年,MD4的创始人开发出MD5算法:
- MD5算法是MD算法中最成熟的算法;
- MD5算法最终也是产生一个128位的散列码;
- MD5效率比MD4慢,但是安全性更高;
- 随着目前计算资源的提升,MD5算法已经被攻破,有很多破译软件进行暴力破解,而且破解速度不断提升;
- 但是MD5算法对于安全性要求不是很高的场景下,仍然广泛流行;
应用场景
信息摘要算法是不可逆的,所以信息摘要场景主要被用来验证信息的完整性,防止信息被篡改,主要场景如下:
- 验签:对要发送的数据做MD5(一般加slat)MD5值和数据一同发送,接收方接受数据做同样的MD5计算,比较MD5值是否一致;
- 敏感信息存储:比如用户密码存储上,一般都是存储MD5值,更高一级的涉及是针对每个用户生成一个随机的slat,然后进MD5(passport + slat)计算,将这个值存储到DB中。
- Spring Security中即使用了敏感信息存储的方式进行了实现;
MD5算法在线破解:http://www.dmd5.com
Java中算法实现
算法供应商选择
选择算法共赢上很大程度决定了API接口的使用方式,Java的加解密供应商主要有三个:Sun,Bouncy Castle和Commons Codec:
- Sun:提供MD2和MD5算法支持,接口比较简答,唯一麻烦的地方是没有提供byte[]转16进制字符串的方法;
- Bouncy Castle:添加了对MD4算法的支持,使用JAVA SPI方式提供,或者自己的API,提供了十六进制的方法;
- Commons Codec:对Sun的Api的封装,支持多种形式参数,支持16进制字符串形式,一般优先推荐;
MessageDigest类
在Java中,MD系列算法以MessageDigest类来完成,具体的实现方式通过JAVA SPI机制注册进去,该类采用策略模式设计。Java本身自JDK 1.6开始提供MD2和MD5算法的支持,使用起来很简单。唯一有点麻烦的地方即JDK的Api返回的数据都是byte[],想要转换为字符串,还需要调用一个转换为16进制的方法,这个方法可以使用HexBin方法或者其他工具,也不复杂。
MD4算法 : JDK没有提供MD4算法支持,需要寻找第三方支持。
在Java中安装第三方算法包,可以通过Java的SPI机制,使用Secuirty.addProvider()方法加载第三方组件。
下面是Java的MD5使用方式:
public class MD5Test { public static void main(String[] args) throws NoSuchAlgorithmException { String input = "Test"; byte[] data = input.getBytes(); MessageDigest md = MessageDigest.getInstance("md5"); byte[] rsBytes = md.digest(data); log(new String(HexBin.encode(rsBytes))); } private static void log(String msg) { System.out.println(msg); }}
DigestInputStream类
如果需要以流的形式进行MD计算,比如对大文件进行MD5计算,可以使用配套类DigestInputStream类,示例代码如下:
public class MDInputStreamTest { public static void main(String[] args) throws NoSuchAlgorithmException, IOException { // 待做消息摘要操作的原始信息 byte[] input = "md5".getBytes(); // 初始化MesssageDigest对象,将使用MD5算法 MessageDigest md = MessageDigest.getInstance("MD5"); // 构建DigestInputStream对象 DigestInputStream in = new DigestInputStream(new ByteArrayInputStream(input), md); try {// 每次读取一段信息,计算MD5值,这里可以分次读取然后记录每次的MD5 in.read(input, 0, input.length); // 获取摘要信息 byte[] rs = in.getMessageDigest().digest(); log(new String(HexBin.encode(rs))); } finally { in.close(); } } private static void log(String msg) { System.out.println(msg); }}
0 0
- 信息摘要技术
- 信息摘要技术
- 信息摘要技术及算法介绍
- 信息摘要
- 技术摘要
- 技术摘要
- Web Services 摘要信息
- 加密解密、信息摘要
- OpenSSL 信息摘要算法
- 信息摘要算法 MessageDigestUtil
- 中文信息摘要
- MD5信息摘要算法
- 信息摘要与数字签名
- MD5(信息-摘要算法)
- MD5信息摘要算法
- android信息-摘要校验信息
- IBM Workplace 技术摘要
- COM技术内幕摘要
- 关于程序员未来的思考
- 程序员和码农有什么差别?
- thinkphp导入导出excel表单数据
- H5表格的例子
- android.content.res.Resources$NotFoundException: String resource ID #0xc8
- 信息摘要技术
- Error:Execution failed for task ':greendaotest:greendao'. > org.eclipse.jdt.
- 个人总结thinkphp中导出数据到excel表格
- leetcode解题之371. Sum of Two Integers Java版 (不使用加减乘除做加法)
- Linux 内核时钟架构之时钟 tick初始化
- elasticsearch注解作用说明
- 2017Wow!新媒体营销深度分享会最新活动内容
- bash命令之linux下并发运行任务
- Mac电脑快捷键(复制粘贴等)修改