鐵人賽第26天,放假的第二天,肉還沒烤,先來被程式烤,因為原本設計的功能都做得差不多了,後面這幾天我會把不完美的洞一個個補起來,今天補的洞是"sha256加密user密碼"。
選擇原因:在查詢如何加密資料的時候,先看到了GetHashCode方法,發現會有collision的可能性,參考網路推薦可以達到強式雜湊的方法,於是選擇了HashAlgorithm。
命名空間:System.Security.Cryptography
使用方法:
HashAlgorithm sha = SHA256.Create();
byte[] result = sha.ComputeHash(dataArray);
可以把SHA256換成指定的加密方法,像是MD5、RIPEMD160、SHA512等等。
因為我把資料庫資料欄位設成nvarchar,還得用到byte[]和string的轉換,轉換方法也紀錄一下。
string str = System.Text.Encoding.Default.GetString ( byteArray );
byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str );
實作
這是我原本的user資料表,密碼是明碼,非常赤裸,處理一下密碼加密的部分吧。
把原本的資料表砍了,再把password欄位設到最大。
我的程式碼:
Register action
[HttpPost]
public ActionResult Register(IFormCollection post)
{
string UID = post["UID"];
string PWD = post["PWD"];
HashAlgorithm sha = SHA256.Create();
byte[] byteArray = System.Text.Encoding.Default.GetBytes ( PWD );
byte[] result = sha.ComputeHash(byteArray);
string str = System.Text.Encoding.Default.GetString ( result );
using (var ctx = new ithelp12Context())
{
var id = ctx.TableUser.Where(s => s.UName == UID ).FirstOrDefault();
if(id != null){
ViewBag.Check = false;
return View("Views/shome/register.cshtml");
}else{
ViewBag.Check =true;
var TableUser = new TableUser{ UName = UID, UPwd = str };
ctx.Add(TableUser);
ctx.SaveChanges();
return View("Views/shome/register.cshtml");
}
}
}
Login action
[HttpPost]
public ActionResult Login(IFormCollection post)
{
string UID = post["UID"];
string PWD = post["PWD"];
HashAlgorithm sha = SHA256.Create();
byte[] byteArray = System.Text.Encoding.Default.GetBytes ( PWD );
byte[] result = sha.ComputeHash(byteArray);
string str = System.Text.Encoding.Default.GetString ( result );
using (var ctx = new ithelp12Context())
{
var user = ctx.TableUser.Where(s => s.UName == UID && s.UPwd == str).FirstOrDefault();
if(user != null){
ViewBag.Check = true;
HttpContext.Session.SetString("UID",UID);
ViewBag.UID = UID;
return View("Views/shome/user_home.cshtml");
}else{
ViewBag.Check =false;
return View("Views/shome/Login.cshtml");}
}
}
結果
先把sandy加回來。
資料庫內的儲存結果。
依序加入原本的user,結果如下圖。
day26心得:
小時候學的密碼學和資訊安全課程,都有提到一些觀念,今天簡單實作的頗有種充實感,蠻愉快的。
啊整個參賽所Po的內容,都是我用過去大學所學習的知識,加上自己從網路資料中摸索的結果,如果有錯誤請告訴我,我會很感激你