MD5值概念解釋:html
轉載自:http://free0007.iteye.com/blog/2047163java
所 謂MD5,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD二、MD三、MD4發展而來的一種單向函數算法(也就是HASH算法),它是國際著名的公鑰加密算法標準RSA的第一設 計者R.Rivest於上個世紀90年代初開發出來的。MD5的最大做用在於,將不一樣格式的大容量文件信息在用數字簽名軟件來簽署私人密鑰前"壓縮"成一 種保密的格式,關鍵之處在於——這種"壓縮"是不可逆的。
爲了讓讀者朋友對MD5的應用有個直觀的認識,筆者以一個比方和一個實例來簡要描述一下其工做過程:
大 家都知道,地球上任何人都有本身獨一無二的指紋,這經常成爲公安機關鑑別罪犯身份最值得信賴的方法;與之相似,MD5就能夠爲任何文件(無論其大小、格 式、數量)產生一個一樣獨一無二的"數字指紋",若是任何人對文件作了任何改動,其MD5值也就是對應的"數字指紋"都會發生變化。
我 們經常在某些軟件下載站點的某軟件信息中看到其MD5值,它的做用就在於咱們能夠在下載該軟件後,對下載回來的文件用專門的軟件(如Windows MD5 Check等)作一次MD5校驗,以確保咱們得到的文件與該站點提供的文件爲同一文件。利用MD5算法來進行文件校驗的方案被大量應用到軟件下載站、論壇 數據庫、系統文件安全等方面。
筆 者上面提到的例子只是MD5的一個基本應用,實際上MD5還被用於加密解密技術上,如Unix、各種BSD系統登陸密碼(在MD5誕生前採用的是DES加 密算法,後因MD5安全性更高,DES被淘汰)、通訊信息加密(如你們熟悉的即時通訊軟件MyIM)、數字簽名等諸多方面。
MD5 將任意長度的「字節串」變換成一個128bit的大整數,而且它是一個不可逆的字符串變換算法,換句話說就是,即便你看到源程序和算法描述,也沒法將一個 MD5的值變換回原始的字符串,從數學原理上說,是由於原始的字符串有無窮多個,這有點象不存在反函數的數學函數。
MD5 的典型應用是對一段Message(字節串)產生fingerprint(指紋),以防止被「篡改」。舉個例子,你將一段話寫在一個叫 readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,而後你能夠傳播這個文件給別人,別人若是修改了文件中的任何內 容,你對這個文件從新計算MD5時就會發現(兩個MD5值不相同)。若是再有一個第三方的認證機構,用MD5還能夠防止文件做者的「抵賴」,這就是所謂的 數字簽名應用。
MD5還普遍用於加密和解密技術上,在不少操做系統中,用戶的密碼是以MD5值(或相似的其它算法)的方式保存的, 用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,而後再去和系統中保存的MD5值進行比較,而系統並不「知道」用戶的密碼是什麼。算法
**** 這個能夠存儲三個值,帳戶、密碼、MD5值密碼,用戶登陸的時把用戶輸入的密碼計算成MD5值,跟在數據庫中存儲的MD5值的密碼,進行對比,這樣就能看到本來的用戶密碼了。而不是MD5加密事後的密碼。sql
JAVA的代碼:數據庫
public static String md5(String str){ String pwd = null; try { // 生成一個MD5加密計算摘要 MessageDigest md = MessageDigest.getInstance("MD5"); // 計算md5函數 md.update(str.getBytes()); // digest()最後肯定返回md5 hash值,返回值爲8爲字符串。由於md5 hash值是16位的hex值,實際上就是8位的字符 // BigInteger函數則將8位的字符串轉換成16位hex值,用字符串來表示;獲得字符串形式的hash值 pwd = new BigInteger(1, md.digest()).toString(16); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return pwd; }
=============================================================================數組
轉載自:http://www.cnblogs.com/sopper/archive/2007/01/08/615111.html安全
環境:vs.net2005/sql server2000/xp測試經過 1.MD5 16位加密實例 using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; namespace md5 { class Program { static void Main(string[] args) { Console.WriteLine(UserMd5("8")); Console.WriteLine(GetMd5Str("8")); } /// <summary> /// MD5 16位加密 /// </summary> /// <param name="ConvertString"></param> /// <returns></returns> public static string GetMd5Str(string ConvertString) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8); t2 = t2.Replace("-", ""); return t2; } /// <summary> /// MD5 32位加密 /// </summary> /// <param name="str"></param> /// <returns></returns> static string UserMd5(string str) { string cl = str; string pwd = ""; MD5 md5 = MD5.Create();//實例化一個md5對像 // 加密後是一個字節類型的數組,這裏要注意編碼UTF8/Unicode等的選擇 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); // 經過使用循環,將字節類型的數組轉換爲字符串,此字符串是常規字符格式化所得 for (int i = 0; i < s.Length; i++) { // 將獲得的字符串使用十六進制類型格式。格式後的字符是小寫的字母,若是使用大寫(X)則格式後的字符是大寫字符 pwd = pwd + s[i].ToString("X"); } return pwd; } } }
加鹽:ide
(【要計算的字符串】+【自定義的字符串】)進行MD5計算 = 【加鹽後的MD5值】函數