日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

md5和SHA校验码

發(fā)布時(shí)間:2023/11/29 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 md5和SHA校验码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

md5已經(jīng)不安全了,中國(guó)山東大學(xué)女學(xué)霸王小云破解了一系列密碼,當(dāng)真是巾幗不讓須眉.說(shuō)是破解,其實(shí)就是給你一個(gè)md5碼,讓你求出這個(gè)md5碼所對(duì)應(yīng)的原始信息,顯然一個(gè)md5對(duì)應(yīng)無(wú)數(shù)種原始信息.而md5的特性就是難以還原初始信息,但是王小云可以迅速找到給定md5碼的可行解.md5的解空間雖然巨大,但是卻難以捕捉到解.

md5雖然已經(jīng)不安全了,但是仍然可以用于校驗(yàn).

md5不是編碼,編碼是能夠還原初始信息的,而md5只是固定的16byte,它只能從總體上反映初始信息的一些特征,卻無(wú)法完整的還原出來(lái),因?yàn)槌跏夹畔⒌絤d5碼是一個(gè)多對(duì)一映射.

md5中大量使用小頭序,這點(diǎn)十分坑.還好java中有神奇?zhèn)ゴ蟮腂yteBuffer.ByteBuffer有四個(gè)索引:mark,limit,position,capacity.

mark表示標(biāo)記;limit表示position最大可以讀到哪里;position表示當(dāng)前位置;capacity表示最大容量.

ByteBuffer這個(gè)類(lèi)支持"流式"編程,比如put(byte)函數(shù)返回值仍然是ByteBuffer,這樣就可以接著put了.

ByteBuffer這個(gè)類(lèi)最重要的就是4個(gè)指針,玩轉(zhuǎn)了四個(gè)指針就學(xué)會(huì)了控制ByteBuffer,例如:

flip()將limit置為當(dāng)前position,將position置為0,準(zhǔn)備從頭讀取數(shù)據(jù),注意只能讀取0~limit這一部分?jǐn)?shù)據(jù);

rewind()將position置為0;

mark()標(biāo)記當(dāng)前position,可以使用reset()將position重置為mark時(shí)的位置.

compact()將當(dāng)前postion之前的字節(jié)清空.

clear()清空一切,將limit移動(dòng)到copacity處,準(zhǔn)備讀入數(shù)據(jù).

明白了如何操作這些指針,就明白了ByteBuffer.

當(dāng)不了解md5的時(shí)候,聽(tīng)人們說(shuō)md5的某些特性,覺(jué)得還是道聽(tīng)途說(shuō),只有親自實(shí)現(xiàn)之后才能自己總結(jié)出md5有哪些特點(diǎn).

下面給出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 {// 移位的位數(shù),分成4種,每種4個(gè)數(shù),每種重復(fù)4次.不知道為啥是這些數(shù)字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函數(shù)中初始化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);}}// 循環(huán)左移操作,比如4位的1011,循環(huán)左移一位相當(dāng)于0110|1int leftRotate(int x, int n) {return (x << n) | (x >>> (32 - n));}byte[] digest(byte[] srcData) throws IOException {// 原數(shù)據(jù)字節(jié)數(shù)+8byte的原始長(zhǎng)度表示=l,l有點(diǎn)偏短,如果它不是64的倍數(shù),那么會(huì)舍棄一些,所以要加上一;如果它是64的倍數(shù),那么需要補(bǔ)上一個(gè)字節(jié),至少要添加一個(gè)chunk.// 一個(gè)chunk為64byte,其中最后一個(gè)chunk的前56byte為數(shù)據(jù)+補(bǔ)齊的數(shù)據(jù),最后8byte為long類(lèi)型的數(shù)據(jù),表示原始數(shù)據(jù)長(zhǎng)度.// 整個(gè)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準(zhǔn)備讀取數(shù)據(jù)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加密強(qiáng)度比md5更強(qiáng),它名叫Secure Hash Algorithm.md5校驗(yàn)碼位長(zhǎng)相當(dāng)于4個(gè)int,SHA的位長(zhǎng)相當(dāng)于5個(gè)int.二者都是以64Byte為一個(gè)chunk進(jìn)行處理.

下面給出java中如何使用庫(kù)函數(shù)自帶的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)));} }

?

總結(jié)

以上是生活随笔為你收集整理的md5和SHA校验码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 婷婷开心激情 | 成人小视频免费在线观看 | 一级片在线免费观看视频 | 成人另类小说 | 97视频免费在线观看 | 久久亚洲精品国产精品黑人v | 成人午夜免费网站 | 国产精品高潮呻吟久久久久久 | 伊人网综合在线 | 国产高清精品一区二区三区 | 国产精品夜夜爽 | 国产乱码一区二区三区 | 日本黄色录像 | 天堂一级片 | 女人脱了内裤趴开腿让男躁 | 日韩中文字幕一区二区三区 | 欧美精品一区二区在线观看 | 欧美日本日韩 | 天天综合天天色 | 亚洲黄色a级片 | 亚洲加勒比| 精品伦精品一区二区三区视频 | 男女草比视频 | 欧美日韩在线免费视频 | 国产精品s色| 青青青国产精品一区二区 | 亚洲精品字幕在线观看 | 久草小说| 超碰久操 | 国产又粗又长 | 亚洲精品v天堂中文字幕 | 久久久精品欧美 | 欧美亚洲一区二区三区 | 日本美女动态图 | 国产美女喷水 | 天天操操操操 | 久久久久久成人精品 | 国产精品爽爽久久久久久 | 又黄又爽又刺激的视频 | 午夜精品视频 | 欧美在线视频a | 亚洲永久精品ww.7491进入 | 国产乱国产乱老熟300部视频 | 欧美一区二区三区黄色 | 国产老女人乱淫免费可以 | 在线观看免费黄色小视频 | 国产美女在线播放 | 38在线视频| 性色av浪潮av | 亚洲日本精品视频 | 神马午夜51 | 日批黄色 | 天堂欧美城网站网址 | 亚洲最大av在线 | 黄片毛片在线看 | 91亚洲精选 | 日韩色黄大片 | 青青久视频 | 精品国产一区二区三区久久久蜜月 | 桃色91 | 污视频在线免费观看 | 在线免费黄色 | 91呦呦| 免费黄色小视频在线观看 | 亚洲乱码国产乱码精品精98午夜 | 欧美日韩精品一区二区三区四区 | 欧美黑丝少妇 | 中国老熟妇自拍hd发布 | 超碰免费在线观看 | 久久综合亚洲精品 | 一区二区在线免费观看 | 欧美黑人巨大xxx极品 | 一区二区三区日韩精品 | 免费日本黄色网址 | 亚洲第一天堂在线观看 | 精彩久久| 欧美韩日精品 | a级黄色片免费看 | 一级大黄色片 | 成人影视网址 | 国产黄色片在线 | 国产欧美精品一区二区三区 | 这里只有精品久久 | 青青草视频免费 | 国产一区二区自拍 | 国产亚洲欧美精品久久久www | av鲁丝一区鲁丝二区鲁丝三区 | 日本高清不卡在线 | 碰碰97 | 日韩一区在线视频 | 色网站免费观看 | 国产又大又硬又粗 | 能免费看18视频网站 | 国产一级爱 | 国产伦精品一区二区三 | 黑人巨大猛交丰满少妇 | 色七七桃花综合影院 | youjizz日本人| 日韩欧美大片 |