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.pswp.cn/news/397601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397601.shtml
英文地址,請注明出處:http://en.pswp.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…