[C#] 使用MD5、SHA-1、SHA-2(SHA-256、SHA-384、SHA-512) 加密資料
前言
對於MD5及SHA的加密方式,大家應該都不陌生,這兩種加密方式都是不可逆的,簡單來說就是只能加密不能解密。
大家或許會問那拿來做甚麼用途,目前想到的主要用途有2個:
-
保護敏感資料:舉例來說資料庫裡使用者的的密碼是非常敏感的資料,如果當資料庫被駭客竊取或者管理者
監守自盜,很容易讓使用者的密碼就外流,因此如果透不可逆的加密方式,就算被竊取到加密過後的密碼,也無從的得知使用者的密碼是為何。
-
比對使用者密碼:因為如果利用加密的方式來比對密碼,即可以讓網站人員達到「比對密碼」且也「無法得知密碼」的效用。舉例來說當使用者註冊時時輸入密碼abcdefg此時我們將密碼hash過後變成esZsDxSN6VGbi9JkMSxNZA==並且存入DB(資料庫),爾後當使用者要進行登入網站,我們要比對密碼時,此時我們把使用者這次輸入的密碼進行hash,再比對看看DB裡之前hash過後的密碼是否一致即可。
「to nick : 那是用來像比對使用者輸入密碼的。 在使用者註冊或修改密碼時,將他的密碼經過Hash後存到DB,之後要比對登入時輸入的密碼,只需要把輸入值Hash後,再與DB讀出來的值比對,就能達到網站人員無法得知使用者的密碼,但又能進行比對。」
(感謝91老師補充)
但是隨著電腦運算能力力越來越強,MD5以及SHA-1目前都已經可以透過碰過攻擊的方式解密以及一些大量的清單可以做比對,詳細可參考MD5及SHA維基百科說明。
現階段還是可以用SHA-2來加密,直接來看看怎麼加密吧!!!!
補充:SHA-224、SHA-256、SHA-384、SHA-512,有時並稱作SHA-2。
目錄
加密方式 | |
---|---|
MD5 |
|
SHA1 |
|
SHA256 |
|
SHA384 |
|
SHA512 |
MD5 |
PS:MD5不建議使用。
引用命名空間:
- using System.Security.Cryptography;
- using System.Text;
MD5 md5 = MD5.Create();//建立一個MD5
byte[] source = Encoding.Default.GetBytes(input.Text);//將字串轉為Byte[]
byte[] crypto = md5.ComputeHash(source);//進行MD5加密
string result = Convert.ToBase64String(crypto);//把加密後的字串從Byte[]轉為字串
Response.Write("MD5加密: " + result);//輸出結果
值:abcdefg
加密:esZsDxSN6VGbi9JkMSxNZA==
精簡
MD5 md5 = MD5.Create();
string resultMd5 = Convert.ToBase64String(md5.ComputeHash(Encoding.Default.GetBytes(input.Text)));
Response.Write("MD5加密: " + resultMd5);
SHA1 |
PS:SHA1不建議使用。
引用命名空間:
- using System.Security.Cryptography;
- using System.Text;
SHA1 sha1 = new SHA1CryptoServiceProvider();//建立一個SHA1
byte[] source = Encoding.Default.GetBytes(input.Text);//將字串轉為Byte[]
byte[] crypto = sha1.ComputeHash(source);//進行SHA1加密
string result = Convert.ToBase64String(crypto);//把加密後的字串從Byte[]轉為字串
Response.Write("SHA1加密: " + result);//輸出結果
值:abcdefg
加密:L7XhNBn8iSRoZeejJPR27GJOh0A=
SHA1 sha1 = new SHA1CryptoServiceProvider();
string resultSha1 = Convert.ToBase64String(sha1.ComputeHash(Encoding.Default.GetBytes(input.Text)));
Response.Write("SHA1加密: " + resultSha1);
SHA256 |
引用命名空間:
- using System.Security.Cryptography;
-
using System.Text;
SHA256 sha256 = new SHA256CryptoServiceProvider();//建立一個SHA256 byte[] source = Encoding.Default.GetBytes(input.Text);//將字串轉為Byte[] byte[] crypto = sha256.ComputeHash(source);//進行SHA256加密 string result = Convert.ToBase64String(crypto);//把加密後的字串從Byte[]轉為字串 Response.Write("SHA256加密: " + result);//輸出結果
值:abcdefg
加密:fRpUEnsiJQL1t5tfsIAwYRUqRPkrN+I8ZSe69mXU2po=
精簡
SHA256 sha256 = new SHA256CryptoServiceProvider();
string resultSha256 = Convert.ToBase64String(sha256.ComputeHash(Encoding.Default.GetBytes(input.Text)));
Response.Write("SHA256加密: " + resultSha256);
SHA384 |
引用命名空間:
- using System.Security.Cryptography;
- using System.Text;
SHA384 sha384 = new SHA384CryptoServiceProvider();//建立一個SHA384
byte[] source = Encoding.Default.GetBytes(input.Text);//將字串轉為Byte[]
byte[] crypto = sha384.ComputeHash(source);//進行SHA384加密
string result = Convert.ToBase64String(crypto);//把加密後的字串從Byte[]轉為字串
Response.Write("SHA384加密: " + result);//輸出結果
值:abcdefg
加密:nxH8ExEj+ETBIm9Cm2oKavBSXZ9A8FbH/BbN8bBr2gjjAlVEF6Wfp9z2JHQhlZ0i
精簡
SHA384 sha384 = new SHA384CryptoServiceProvider();
string resultSha384 = Convert.ToBase64String(sha384.ComputeHash(Encoding.Default.GetBytes(input.Text)));
Response.Write("SHA384加密: " + resultSha384);
SHA512 |
引用命名空間:
- using System.Security.Cryptography;
- using System.Text;
SHA512 sha512 = new SHA512CryptoServiceProvider();//建立一個SHA512
byte[] source = Encoding.Default.GetBytes(input.Text);//將字串轉為Byte[]
byte[] crypto = sha512.ComputeHash(source);//進行SHA512加密
string result = Convert.ToBase64String(crypto);//把加密後的字串從Byte[]轉為字串
Response.Write("SHA512加密: " + result);//輸出結果
值:abcdefg
加密:1xakGIVptoqxtt+sF45XARTN8Oo6HMDjFIbD5BJBvGp2Qk6MN6sm8Jb8he+YhsjLY0GH9P3f9kX7CZ8f9UxrjA==
精簡
SHA512 sha512 = new SHA512CryptoServiceProvider();
string resultSha512 = Convert.ToBase64String(sha512.ComputeHash(Encoding.Default.GetBytes(input.Text)));
Response.Write("SHA512加密: " + resultSha512);
如有錯誤還請各位先進前輩們不吝嗇的指教,謝謝。