MD5簡介
MD5的全稱是Message-Digest Algorithm 5,由麻省理工學院計算機科學實驗室和RSA數據安全公司在90年代初發明,由MD2、MD3和MD4發展而來。
消息摘要(Message-Digest)壹般指消息的哈希變換,即把任意長度的字節串變換成壹定長度的大整數。請註意,我使用了“字節串”這個詞,而不是“字符串”,因為這種轉換只與字節的值有關,與字符集或編碼方法無關。
MD5將任意長度的“字節串”轉換成128bit的大整數,是壹種不可逆的字符串轉換算法。換句話說,即使妳看到了源程序和算法的描述,妳也無法將壹個MD5值轉換回原來的字符串。從數學上講,是因為有無限個原串,有點像沒有反函數的數學函數。
MD5的典型應用是為消息(字節串)生成指紋,以防止其被篡改。例如,如果您在壹個名為readme.txt的文件中寫了壹段話,並為這個readme.txt生成壹個MD5值並記錄下來,那麽您就可以將這個文件傳播給他人。如果其他人修改了文件中的任何內容,當您重新計算該文件的MD5時,您會發現它。如果有第三方認證機構,MD5還可以防止文檔作者的“否認”,也就是所謂的數字簽名應用。
MD5也廣泛應用於加密和解密技術。在很多操作系統中,用戶的密碼是以MD5值的形式保存的(或者類似的其他算法)。當用戶登錄時,系統將用戶輸入的密碼計算為MD5值,然後與系統中保存的MD5值進行比較,但系統並不“知道”用戶的密碼是什麽。
壹些黑客破解這個密碼的方式是壹種叫做“運行字典”的方法。字典的獲取方式有兩種,壹種是日常收集的用作密碼的字符串表,另壹種是通過排列組合的方法生成的。首先用MD5程序計算這些字典項的MD5值,然後在這個字典中查找目標的MD5值。
即使密碼的最大長度是8,並且密碼只能是字母和數字,***26+26+10=62個字符,字典中的條目數也是p (62,1)+p (62,2)...+p (62,8),那麽
在許多電子商務和社區應用中,管理用戶帳戶是最常用的基本功能之壹。盡管許多應用服務器提供了這些基本組件,但許多應用程序開發人員更喜歡使用關系數據庫來管理用戶,以獲得更大的管理靈活性。懶惰的方法是,用戶的密碼通常在經過純文本或簡單轉換後直接存儲在數據庫中。所以這些用戶的密碼對於軟件開發者或者系統管理員來說,可以說已經不是什麽秘密了。本文的目的是介紹Java Bean的MD5的實現,同時給出壹個用MD5處理用戶帳號密碼的例子。這種方法使得管理員和程序員無法看到用戶的密碼,盡管他們可以初始化密碼。但是保護用戶的密碼設置習慣很重要。
感興趣的讀者可以得到MD5的文本,即RFC 1321。. IBM . com/developer works/Java/jw-tips/tip 106/index . shtml
本文描述了將測試和示例代碼放在內部靜態類中的優點,這是壹種很好的工程技巧和方法。
將Java Bean放入JSP中
正如我們在本文開頭所說的,我們的MD5 Bean應用程序是基於用戶管理的。這裏,我們假設壹個虛擬社區中的用戶登錄過程,用戶信息存儲在數據庫中壹個名為users的表中。這個表有兩個與我們的例子相關的字段,userid :char(20)和pwdmd5 :char(32)。Userid是該表的主鍵,pwdmd5存儲密碼的md5字符串。MD5值是128bit的大整數,用16表示成ASCII碼需要32個字符。
這裏有兩個文件,login.html用於接受用戶輸入表單,login用於模擬使用MD5 Bean的登錄過程。
為了使我們的測試環境簡單,我們在JSP中使用JDK內置的JDBC-ODBC橋驅動程序,community是ODBC DSN的名字。如果妳使用其他的login.jsp JDBC驅動,請更換它。
connection con = driver manager . getconnection(" JDBC:odbc:community ",""," ");
去做吧。
login.jsp的工作原理很簡單。它通過post接收用戶輸入的UserID和密碼,然後將密碼轉換成MD5字符串,然後在users表中查找UserID和pwdmd5,因為UserID是users表的主鍵。如果轉換後的pwdmd5與表中的記錄不匹配,SQL查詢將得到壹個空結果集。
這裏需要簡單介紹的是,要使用這個Bean,只需要在妳的JSP應用的WEB-INF/classes下創建壹個beartool目錄,然後將MD5.class復制到那個目錄中。如果使用壹些集成開發環境,請參考他們的部署工具描述。在JSP中使用java Bean的關鍵語句是程序中的第二行:
& ltJSP:useBean id = ' om D5 ' scope = ' request ' class = ' bear tool。MD5 '/& gt;
這是所有JSP規範都要求JSP容器開發人員提供的標準標記。
Id=實際上是指示JSP容器創建Bean實例的實例變量名。在後面
java應用服務器執行的過程。JSP就是把它預編譯成。java(預編譯時那些標簽會變成Java語句),然後編譯成。班級。這些是由系統自動完成和維護的。類也稱為Servlet。當然,如果妳願意,妳也可以幫助Java應用服務器做它應該做的事情,直接寫servlet,但是用servlet輸出HTML,簡直是用c寫CGI程序的噩夢時代。
如果您的輸出是壹個復雜的表格,更方便的方法是用您熟悉的HTML編輯器編寫壹個“模板”,然後“嵌入”JSP代碼。雖然這段JSP代碼被壹些專家指責為“空粉”,但它確實有壹個缺點就是代碼難以管理和重用,但這是編程永遠需要的權衡。我個人認為,對於中小型項目來說,理想的結構是把數據表示的部分(或者松散地稱為WEB接口相關的)寫在JSP中,把與接口無關的部分放在Bean中。壹般沒必要直接寫Servlet。
如果妳覺得這個方法不是很面向對象,妳可以擴展它,寫壹個bean來封裝用戶管理功能。
兼容不兼容?
我測試了三個Java應用服務器環境,Resin 1.2.3、Sun J2EE 1.2和IBM WebSphere 3.5。好在這個Java Bean沒有任何問題,因為它只是壹個計算程序,不涉及操作系統和I/O設備。事實上,其他語言可以很容易地實現它的兼容性。Java唯壹的優勢就是妳只需要提供壹種運行代碼的形式。請註意“形態學”這個詞。如今,除了語言本身,許多計算結構和操作系統還定義了大量的代碼形態。把壹段非常簡單的C語言核心代碼轉換成不同的形態,需要考慮很多問題,使用很多工具,同時施加很多限制。有時候,學習壹個新的“形態學”可能比解決問題本身需要更多的精力。例如,僅Windows就有EXE、Service、common DLL、COM DLL和OCX等。雖然在Unix上比較簡單,但是需要提供壹個. h來定義很多宏,不同平臺的編譯器版本的位長也要考慮。我覺得這是Java對我很重要的壹個魅力。
MD5算法描述
首先,填補職位空缺
第二,補充數據的長度
第三,初始化MD5參數
四、加工位操作功能
五、主要轉化過程
六、輸出結果
補充:
MD5算法首先對輸入數據進行補碼,這樣數據位長度LEN補碼到512的結果就是448。即數據擴展到K*512+448位。即K*64+56字節,K為整數。
具體填充操作:先填壹個1,再填0,直到滿足上述要求。
補充數據長度:
用壹個64位的數來表示數據的原始長度b,用兩個32位的數來表示b,這時數
數據被填充為長度為512位的倍數。
初始化MD5參數:
四個32位整數(A,B,C,D)用於計算信息摘要,十六進制表用於初始化。
顯示的數字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
處理位操作功能:
x、y和z是32位整數。
F(X,Y,Z)= X & amp;y | NOT(X)amp;Z
G(X,Y,Z)= X & amp;Z|Y?(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X|not(Z))
主要轉化過程:
常量數組T[1...64]使用,其中T[i]是用十六進制16表示的32位整數,數據是16 32位。
的整數數組M[]。
具體流程如下:
/*處理原始數據*/
對於i = 0到N/16-1 do
/*每次都將原始數據存放在16個元素的數組X中。*/
對於j = 0到15做
設置X[j]為M[i*16+j]。
結束j的循環。
/*將A另存為AA,B另存為BB,C另存為CC,D另存為d D。
*/
AA = A
BB = B
CC = C
DD = D
/* Round 1 */
/*以下操作由[abcd k s i]表示
a = b + ((a + F(b,c,d)+X[k]+T[I])& lt;& lt& lts)。*/
/*做以下16操作。*/
[ABCD 0 7 1][DABC 1 12 2][CDAB 2 17 3][BCDA 3
22 4]
[ABCD 4 7 5][DABC 5 12 6][CDAB 6 17 7][BCDA 7
22 8]
[ABCD 8 7 9][DABC 9 12 10][CDAB 10 17 11][BCDA
11 22 12]
[ABCD 12 7 13][DABC 13 12 14][CDAB 14 17 15]
[BCDA 15 22 16]
/*第二輪* */
/*以下操作由[abcd k s i]表示
a = b + ((a + G(b,c,d)+X[k]+T[I])& lt;& lt& lts)。*/
/*做以下16操作。*/
[ABCD 1 5 17][DABC 6 9 18][CDAB 11 14 19][BCDA
0 20 20]
[ABCD 5 5 21][DABC 10 9 22][CDAB 15 14 23]
[BCDA 4 20 24]
[DABC 14926][CDAB 31427][BCDA
8 20 28]
[ABCD 13 5 29][DABC 2 9 30][CDAB 7 14 31][BCDA
12 20 32]
/*第三輪*/
/*以下操作由[abcd k s i]表示
a = b + ((a + H(b,c,d)+X[k]+T[I])& lt;& lt& lts)。*/
/*做以下16操作。*/
[ABCD 5 4 33][DABC 8 11 34][CDAB 11 1 16 35]
[BCDA 14 23 36]
[ABCD 1 4 37][DABC 4 11 38][CDAB 7 16 39][BCDA
10 23 40]
[ABCD 13 4 41][DABC 0 11 42][CDAB 3 16 43]
[BCDA 6 23 44]
[ABCD 9 4 45][DABC 12 11 46][CDAB 15 16 47]
[BCDA 2 23 48]
/*第4輪*/
/*以下操作由[abcd k s i]表示
a = b + ((a + I(b,c,d)+X[k]+T[I])& lt;& lt& lts)。*/
/*做以下16操作。*/
[ABCD 0 6 49][DABC 7 10 50][CDAB 14 15 51]
[BCDA 5 21 52]
[ABCD 12653][DABC 31054][CDAB 101555]
[BCDA 65438+21 56]
[ABCD 8 6 57][DABC 15 10 58][CDAB 6 15 59]
[BCDA 13 21 60]
[ABCD 4 6 61][DABC 11 10 62][CDAB 2 15 63]
[BCDA 9 21 64]
/*然後執行以下操作*/
A = A + AA
B = B + BB
C = C + CC
D = D + DD
End /*結束I */的循環
輸出結果。