麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

MD5的Java Bean實現

2019-11-18 11:35:21
字體:
來源:轉載
供稿:網友
md5簡介

  MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。

  Message-Digest泛指字節串(Message)的Hash變換,就是把一個任意長度的字節串變換成一定長的大整數。請注重我使用了“字節串”而不是“字符串”這個詞,是因為這種變換只與字節的值有關,與字符集或編碼方式無關。

  MD5將任意長度的“字節串”變換成一個128bit的大整數,并且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數的數學函數。

  MD5的典型應用是對一段Message(字節串)產生fingerPRint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫readme.txt文件中,并對這個readme.txt產生一個MD5的值并記錄在案,然后你可以傳播這個文件給別人,別人假如修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現。假如再有一個第三方的認證機構,用MD5還可以防止文件作者的“抵賴”,這就是所謂的數字簽名應用。

  MD5還廣泛用于加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的, 用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然后再去和系統中保存的MD5值進行比較,而系統并不“知道”用戶的密碼是什么。

  一些黑客破獲這種密碼的方法是一種被稱為“跑字典”的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字符串表,另一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5值,然后再用目標的MD5值在這個字典中檢索。

  即使假設密碼的最大長度為8,同時密碼只能是字母和數字,共26+26+10=62個字符,排列組合出的字典的項數則是P(62,1)+P(62,2)….+P(62,8),那也已經是一個很天文的數字了,存儲這個字典就需要TB級的磁盤組,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。

  在很多電子商務和社區應用中,治理用戶的Account是一種最常用的基本功能,盡管很多application Server提供了這些基本組件,但很多應用開發者為了治理的更大的靈活性還是喜歡采用關系數據庫來治理用戶,懶惰的做法是用戶的密碼往往使用明文或簡單的變換后直接保存在數據庫中,因此這些用戶的密碼對軟件開發者或系統治理員來說可以說毫無保密可言,本文的目的是介紹MD5的java Bean的實現,同時給出用MD5來處理用戶的Account密碼的例子,這種方法使得治理員和程序設計者都無法看到用戶的密碼,盡管他們可以初始化它們。但重要的一點是對于用戶密碼設置習慣的保護。

  有愛好的讀者可以從這里取得MD5也就是RFC 1321的文本。http://www.ietf.org/rfc/rfc1321.txt

  實現策略

  MD5的算法在RFC1321中實際上已經提供了C的實現,我們其實馬上就能想到,至少有兩種用Java實現它的方法,第一種是,用Java語言重新寫整個算法,或者再說簡單點就是把C程序改寫成Java程序。第二種是,用JNI(Java Native Interface)來實現,核心算法仍然用這個C程序,用Java類給它包個殼。

  但我個人認為,JNI應該是Java為了解決某類問題時的沒有辦法的辦法(比如與操作系統或I/O設備密切相關的應用),同時為了提供和其它語言的互操作性的一個手段。使用JNI帶來的最大問題是引入了平臺的依靠性,打破了SUN所鼓吹的“一次編寫到處運行”的Java好處。因此,我決定采取第一種方法,一來和大家一起嘗試一下“一次編寫到處運行”的好處,二來檢驗一下Java 2現在對于比較密集的計算的效率問題。

  實現過程

  限于這篇文章的篇幅,同時也為了更多的讀者能夠真正專注于問題本身,我不想就某一種Java集成開發環境來介紹這個Java Bean的制作過程,介紹一個方法時我發現步驟和命令很清楚,我相信有任何一種Java集成環境三天以上經驗的讀者都會知道如何把這些代碼在集成環境中編譯和運行。用集成環境講述問題往往需要配很多屏幕截圖,這也是我一直對集成環境很頭疼的原因。我使用了一個普通的文本編輯器,同時使用了Sun公司標準的JDK 1.3.0 for Windows NT。

  其實把C轉換成Java對于一個有一定C語言基礎的程序員并不困難,這兩個語言的基本語法幾乎完全一致.我大概花了一個小時的時間完成了代碼的轉換工作,我主要作了下面幾件事:


  把必須使用的一些#define的宏定義變成Class中的final static,這樣保證在一個進程空間中的多個Instance共享這些數據

  刪去了一些無用的#if define,因為我只關心MD5,這個推薦的C實現同時實現了MD2 MD3和 MD4,而且有些#if define還和C不同編譯器有關

  將一些計算宏轉換成final static 成員函數。

  所有的變量命名與原來C實現中保持一致,在大小寫上作一些符合Java習慣的變化,計算過程中的C函數變成了private方法(成員函數)。

  要害變量的位長調整

  定義了類和方法

  需要注重的是,很多早期的C編譯器的int類型是16 bit的,MD5使用了unsigned long int,并認為它是32bit的無符號整數。而在Java中int是32 bit的,long是64 bit的。在MD5的C實現中,使用了大量的位操作。這里需要指出的一點是,盡管Java提供了位操作,由于Java沒有unsigned類型,對于右移位操作多提供了一個無符號右移:>>>,等價于C中的 >> 對于unsigned 數的處理。

  因為Java不提供無符號數的運算,兩個大int數相加就會溢出得到一個負數或異常,因此我將一些要害變量在Java中改成了long類型(64bit)。我個人認為這比自己去重新定義一組無符號數的類同時重載那些運算符要方便,同時效率高很多并且代碼也易讀,OO(Object Oriented)的濫用反而會導致效率低下。

  限于篇幅,這里不再給出原始的C代碼,有愛好對照的讀者朋友可以去看RFC 1321。MD5.java源代碼

  測試

  在RFC 1321中,給出了Test suite用來檢驗你的實現是否正確:



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日本在线播放一区二区三区 | av电影观看 | 久久久久久久久久亚洲 | 国产在线精品一区二区三区不卡 | 久色视频| 手机在线看片国产 | 在线中文字幕网站 | 欧美一级做a | 九九热免费在线观看 | 欧美伦理一区二区 | 国产999视频在线观看 | 久久免费视频一区二区三区 | 国产色91 | 在线成人免费网站 | 国产亚洲精品久久久久婷婷瑜伽 | 午夜精品在线视频 | 精品免费国产一区二区三区 | free japan xxxxhdsex69 | 国内精品免费一区二区2001 | 天天透天天狠天天爱综合97 | 色骚综合| 一级毛片播放 | 久久tv免费国产高清 | 空姐一级毛片 | 成人在线视频免费 | 色淫网站免费视频 | 中文字幕网站在线 | 黄色毛片一级视频 | 黄色一级片在线观看 | 成年性羞羞视频免费观看 | 欧美日韩色 | 强伦女教师视频 | 姑娘第四集免费看视频 | 天天撸日日夜夜 | 国产a级片电影 | 日本爽快片100色毛片视频 | 91快色| 一级做a爰片性色毛片2021 | 国产精品久久久久久久四虎电影 | 狠狠干五月 | 97中文字幕第一一一页 |