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|1int 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)));}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Confluence 6 附件存储文件系统的分级

从 Confluence 3.0 开始&#xff0c;附件的存储方式有了重大的改变和升级。如果你是从 Confluence 2.10 及其早期版本升级上来的&#xff0c;请参考 Upgrading Confluence 页面中推荐的升级路径&#xff0c;同时请阅读 Confluence 3.0 文档中 Hierarchical File System Attachm…

Fragment与Activity交互(使用接口)

在Fragment中: 1. // 定义一个回调接口&#xff0c;该Fragment所在Activity需要实现该接口// 该Fragment将通过该接口与它所在的Activity交互 { public void onItemSelected(Integer id);}2. // 当该Fragment被添加、显示到Activity时&#xff0c;回调该方法 public void onA…

java保龄球计分_自己写的java保龄球记分

package com.java.bowlingscore1;import java.util.Arrays;public class Game { int[] bowlingScore new int[21]; //用来存放投掷击倒的数目 int ball0; //数组下标 int score;//分数 int countframe0;//记录当前是第几轮 boolean firs…

你不知道的JavaScript-0

【数组】 删除数组的几种方法&#xff1a; https://www.cnblogs.com/Joans/p/3981122.html http://www.cnblogs.com/qiantuwuliang/archive/2010/09/01/1814706.html 【数字转换】 parseInt(num, radix): 【宽松相等和严格相等】 允许在相等比较中进行强制类型转换&#xff0c…

真是,原来可以这样啊

一下午&#xff0c;解决了两个问题。。。。。 先列上这两个真是Bug的问题&#xff1a; 1、数据库有个表book&#xff0c;里面有个字段 create_time Datetime类型的字段&#xff0c;这个字段是 not null 的。下午下代码往数据库里插入数据时&#xff0c;总是提示&#xff0c;cre…

1026. Table Tennis (30)

题目如下&#xff1a; A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For any pair of players, if there are some tables open when they arrive, they will be assigned to the available table with the smallest numb…

java运行时异常中文_JAVA——运行时异常(RuntimeException)

Exception中有一个特殊的子类异常RuntimeException运行时异常。如果在函数内抛出该异常&#xff0c;函数上可以不用声明&#xff0c;编译一样通过。如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过。之所以不用在函数上声明&#xff0c;是因为不需要让调用者处…

内置函数isinstance和issubclass

1. isinstance&#xff08;obj,class&#xff09; 判断对象obj是不是由class生成的对象。 class Foo:passobjFoo()print(isinstance(obj,Foo))obj是Foo的生成的对象&#xff0c;返回True。如果不是&#xff0c;则返回False。 d{x:1} #ddict({x:1} #)print(type(d) is dict) pri…

JavaOne 2016——首日亮点

今年&#xff0c;为期5天的JavaOne会议中&#xff0c;4个会场的议题都进行了直播&#xff0c;演讲稿也在播出之后一并提供。\\来自Terracotta公司EHCache团队的Henri Tremblay&#xff0c;做了主题为《学习Java 8&#xff1a;Lambda表达式和函数式编程&#xff08;Learn Java 8…

指针数据类型 java_C/C++ 指针的小结——指针与其它数据类型(数组、字符串、函数、结构体)的关系...

一、指针与数组和字符串1、指针与数组当声明数时&#xff0c;编译器在连续的内存空间分配基本地址和足够的储存空间&#xff0c;以容纳数组的所有元素。基本地址是数组第一个元素(索引为0)的存储位置。编译器还把数组名定义为指向第一个元素的常量指针。元素的地址是通过索引和…

Linux tr命令详解

tr是个简单的替换命令&#xff0c;从标准输入中替换、缩减和/或删除字符&#xff0c;并将结果写到标准输出。 tr常见命令参数 用法&#xff1a;tr [选项]... SET1 [SET2] 从标准输入中替换、缩减和/或删除字符&#xff0c;并将结果写到标准输出。-c, -C, --complement …

512M内存编译php出错

make时错误如下 1 virtual memory exhausted: Cannot allocate memory make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1 内存小造成的&#xff0c;为了成功的话需要加上参数 –disable-fileinfo即可参考链接&#xff1a;https://bugs.php.net/bug.php?id48809 转载于…

Android中插件开发篇总结和概述

刚刚终于写完了插件开发的最后一篇文章&#xff0c;下面就来总结一下&#xff0c;关于Android中插件篇从去年的11月份就开始规划了&#xff0c;主要从三个方面去解读Android中插件开发原理。说白了&#xff0c;插件开发的原理就是&#xff1a;动态加载技术。但是我们在开发插件…

java反射机制 路径_Java 反射机制详解

引言本文主要介绍Java中&#xff0c;有关反射机制、类的加载过程、以及控制反转方面的内容。Java 反射机制Java创建对象的方式有哪些&#xff1a;new、反射、反序列化、克隆class对象获取的方法有哪些&#xff1a;类名.class、getClass、forName、classLoader.loadClass(‘包类…

prop和attr在 jquery的

https://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html转载于:https://www.cnblogs.com/beimingbingpo/p/9254680.html

java传入数据库生成柱状图_Java读取数据库数据生成柱状图

此案例是用swing显示数据的。须要引入jfreechart相关包。不同版本号可能包不同样。本人用的是此案例在ssi框架下会报错&#xff0c;不用框架就没问题。Java后台逻辑代码&#xff1a;public class BarChart {ChartPanel frame1;public BarChart() {CategoryDataset dataset get…

SVN系列操作(一)

SVN是什么&#xff1f; SVN是Subversion的简称&#xff0c;是一个开放源代码的版本控制系统&#xff0c;常用于软件开发项目中&#xff0c;实现代码、文档等的历史版本保存、共享和权限管理。 进入SVN本地目录&#xff0c;第一步操作就是update。 为什么呢&#xff1f;因为SVN是…

ubuntu-14.04.2-desktop使用方法

一、安装VMware Tools 1. 在VMware Workstation11.1.0下安装Ubuntu镜像&#xff1a;ubuntukylin-14.04.2-desktop-amd64.iso 2. 点击虚拟机菜单栏-安装VMware Tools。 3. 在Ubuntu系统光盘中找到VMwareTools-9.9.2-2496486.tar.gz&#xff0c;右键复制到“桌面”&#xff0c;然…

ubuntu 跟xshell的问题

有2个分析&#xff1a; 1&#xff1a;是windos的防火墙没有关闭 2&#xff1a;是虚拟机没有安装sshd服务器 ubuntu在CLI界面下输入&#xff1a;dpkg -l |grep ssh 因为是我安装过的sshd server 要是没有sshd server 就要输入 安装。 三&#xff1a;要是安装完之后 链接显示说…

java gdal postgresql_使用GDAL/OGR操作Postgresql数据库

&#xfeff;&#xfeff;GDAL(Geospatial Data AbstractionLibrary)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。本文将使用GDAL/OGR库读写Postgresql数据库中的表&#x…