md5和SHA校验码
md5已经不安全了,中国山东大学女学霸王小云破解了一系列密码,当真是巾帼不让须眉.说是破解,其实就是给你一个md5码,让你求出这个md5码所对应的原始信息,显然一个md5对应无数种原始信息.而md5的特性就是难以还原初始信息,但是王小云可以迅速找到给定md5码的可行解.md5的解空间虽然巨大,但是却难以捕捉到解.
md5虽然已经不安全了,但是仍然可以用于校验.
md5不是编码,编码是能够还原初始信息的,而md5只是固定的16byte,它只能从总体上反映初始信息的一些特征,却无法完整的还原出来,因为初始信息到md5码是一个多对一映射.
md5中大量使用小头序,这点十分坑.还好java中有神奇伟大的ByteBuffer.ByteBuffer有四个索引:mark,limit,position,capacity.
mark表示标记;limit表示position最大可以读到哪里;position表示当前位置;capacity表示最大容量.
ByteBuffer这个类支持"流式"编程,比如put(byte)函数返回值仍然是ByteBuffer,这样就可以接着put了.
ByteBuffer这个类最重要的就是4个指针,玩转了四个指针就学会了控制ByteBuffer,例如:
flip()将limit置为当前position,将position置为0,准备从头读取数据,注意只能读取0~limit这一部分数据;
rewind()将position置为0;
mark()标记当前position,可以使用reset()将position重置为mark时的位置.
compact()将当前postion之前的字节清空.
clear()清空一切,将limit移动到copacity处,准备读入数据.
明白了如何操作这些指针,就明白了ByteBuffer.
当不了解md5的时候,听人们说md5的某些特性,觉得还是道听途说,只有亲自实现之后才能自己总结出md5有哪些特点.
下面给出md5信息摘要算法
import static java.lang.Math.abs; import static java.lang.Math.floor; import static java.lang.Math.pow; import static java.lang.Math.sin; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 { // 移位的位数,分成4种,每种4个数,每种重复4次.不知道为啥是这些数字 int[] s = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}; // 在init函数中初始化k[i] int k[] = new int[64]; void init() { for (int i = 0; i < 64; i++) { long x = (long) floor(abs(sin(i + 1)) * pow(2, 32)); k[i] = (int) (x & 0xffffffff); } } // 循环左移操作,比如4位的1011,循环左移一位相当于0110|1 int leftRotate(int x, int n) { return (x << n) | (x >>> (32 - n)); } byte[] digest(byte[] srcData) throws IOException { // 原数据字节数+8byte的原始长度表示=l,l有点偏短,如果它不是64的倍数,那么会舍弃一些,所以要加上一;如果它是64的倍数,那么需要补上一个字节,至少要添加一个chunk. // 一个chunk为64byte,其中最后一个chunk的前56byte为数据+补齐的数据,最后8byte为long类型的数据,表示原始数据长度. // 整个md5都是基于小头序的 int chunkCount = (srcData.length + 8) / 64 + 1; ByteBuffer buffer = ByteBuffer.allocate(chunkCount * 64) .order(ByteOrder.LITTLE_ENDIAN); buffer.put(srcData).put((byte) 0x80).position(buffer.limit() - 8); buffer.putLong(8 * srcData.length).flip();//flip准备读取数据 int a0 = 0x67452301, b0 = 0xefcdab89, c0 = 0x98badcfe, d0 = 0x10325476; while (buffer.hasRemaining()) { int m[] = new int[16]; for (int i = 0; i < 16; i++) { m[i] = buffer.getInt(); } int a = a0, b = b0, c = c0, d = d0; int f, g; for (int i = 0; i < 64; i++) { if (i < 16) { f = (b & c) | (~b & d); g = i; } else if (i < 32) { f = (d & b) | (~d & c); g = (5 * i + 1) % 16; } else if (i < 48) { f = b ^ c ^ d; g = (3 * i + 5) % 16; } else { f = c ^ (b | ~d); g = (7 * i) % 16; } int dd = d; d = c; c = b; b = b + leftRotate(a + f + k[i] + m[g], s[i]); a = dd; } a0 += a; b0 += b; c0 += c; d0 += d; } return ByteBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN).putInt(a0) .putInt(b0).putInt(c0).putInt(d0).array(); } static void show(byte[] b) { for (byte i : b) { System.out.printf("%02X", i); } System.out.println(); } public static void main(String[] args) throws NoSuchAlgorithmException, IOException { byte[] b = "魏印福".getBytes(); MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(b); byte[] res = md5.digest(); show(res); MD5 m = new MD5(); m.init(); res = m.digest(b); show(res); } }
跟md5一样,SHA也有好多版本,SHA1,SHA2,SHA3,其中SHA2,SHA3又分成了好多版本.SHA加密强度比md5更强,它名叫Secure Hash Algorithm.md5校验码位长相当于4个int,SHA的位长相当于5个int.二者都是以64Byte为一个chunk进行处理.
下面给出java中如何使用库函数自带的SHA
public class SHA { static String tos(byte[] b) { String ans = ""; for (int i = 0; i < b.length; i++) { ans += String.format("%02X", b[i]); } return ans; } public static void main(String[] args) throws Exception { byte[] data = "魏印福".getBytes(); MessageDigest digest = MessageDigest.getInstance("SHA"); byte[] ans = digest.digest(data); System.out.println(tos(ans)); System.out .println(tos(MessageDigest.getInstance("SHA-1").digest(data))); } }
md5和SHA校验码的更多相关文章
- MD5、SHA校验命令
linux系统的软件很多时候都以境像的方式提供下载,但我们如何确实下载的文件是没有被篡改过的呢?Linux中一般用对下载的文件进行MD5和SHA校验来确认. MD5 我们拿iptraf软件来试验: 我 ...
- Android MD5校验码的生成与算法实现
在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 ...
- C# 获取文件MD5校验码
using System; using System.IO; using System.Security.Cryptography; using System.Text; public class M ...
- Java 获取 文件md5校验码
讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...
- 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3
[程序介绍]免费开源的 文件 MD5 SHA1 SHA256 SHA512 校验码生成工具 V1.3 这是一个有意思的程序,同一个程序,即是图形程序,又是命令行程序.程序作用:输入一个文件的路径,输出 ...
- java生成MD5校验码
在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 ...
- 脚本_根据 md5 校验码,检测文件是否被修改
#!bin/bash#功能:根据 md5 校验码,检测文件是否被修改#作者:liusingbon#本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文 ...
- 加密算法中BASE64、MD5、SHA、HMAC等之间的区别
http://blog.csdn.net/lplj717/article/details/51828692 根据项目需要了解了一下几种加密算法(参考其他博客),内容简要介绍BASE64.MD5.SHA ...
- 简要介绍BASE64、MD5、SHA、HMAC几种方法。
加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书. ...
随机推荐
- arcgis server10.2.2之地理编码服务发布
1.地理编码工具(Geocoding Tools)locator制作 打开arcCatalog,找到工具箱ArcToolbox中的Geocoding Tools---Create Addres ...
- HTML 迷宫
今天补个遗,将很久以前研究 HTML5 的时候写的生成迷宫.迷宫寻路程序整理出来. 下载链接在文章最后. 简介 为什么要做这个 HTML5 迷宫程序?因为我喜欢.我愿意.也是向老程序员学习(见第5节) ...
- iOS - 对OOA、OOD、OOP的理解
很多人在求职的时候,会遇到一个这样的问题:“对OOD/OOP有较深的理解”,这个时候有人就会问OOD.OOP是什么呢?那么今天咱们就一块来看一下OOA.OOD.OOP到底是什么! (一)OOA--面向 ...
- 长链接转换成短链接(iOS版本)
首先需要将字符串使用md5加密,添加NSString的md5的类别方法如下 .h文件 #import <CommonCrypto/CommonDigest.h> @interface NS ...
- Android Studio连接真机没反应?
刚好遇到这个问题,在网上百度了一下,看到有人分享了引起该问题的几个原因: 手机设置问题.开USB调试 方法: 手机设置 - 开发人员选项 - USB调试 - 勾选 数据线问题. 有的数据线只能用来充电 ...
- SSIS 通过添加脚本组件 自定义转换数据
问题:从mysql导入到sql的汉字都是乱码或者干脆导入不成功,报”截断字符串“错误,错在mysql当时建立的都是使用的默认编码latin1;搞不明白,又不是瑞典人,你用这个干毛.导致现在遇到n多问题 ...
- MS SQL巡检系列——检查数据库上一次DBCC CHECKDB的时间
DBCC CHECKDB检查指定数据库中的所有对象的逻辑和物理完整性,具体请参考MSDN文档.我们必须定期对数据库做完整性检查(DBCC CHECKDB),以便能及时发现一些数据库损坏(Corrupt ...
- percona教程:MySQL GROUP_CONCAT的使用
percona有一篇blog: The power of MySQL GROUP_CONCAT 比较详细地介绍了GROUP_CONCAT函数的用法.简单地翻译了一下. 假设你有4名工程师,这周他们为6 ...
- 报表开发工具Finereport移动端app js接口列表【全】
应用报表工具Finereport的开发人员会发现其移动端app 同样也推出了很多js接口,那这些接口到底有多少,其移动端又有哪些地方支持调用js,这些接口具体又该如何调用呢.根据我平时的开发经验,给大 ...
- (转)java字节流和字符流的区别
转载: http://www.cnblogs.com/dolphin0520/category/361055.html 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同 ...