iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
Modern Web

零經驗ASP .NET Core 30 DAY全紀錄系列 第 26

零經驗 .NET Core 30 DAY----- Day26 HashAlgorithm做密碼加密&byte[]和string的轉換

  • 分享至 

  • xImage
  •  

鐵人賽第26天,放假的第二天,肉還沒烤,先來被程式烤,因為原本設計的功能都做得差不多了,後面這幾天我會把不完美的洞一個個補起來,今天補的洞是"sha256加密user密碼"。

一、加密方法:HashAlgorithm

選擇原因:在查詢如何加密資料的時候,先看到了GetHashCode方法,發現會有collision的可能性,參考網路推薦可以達到強式雜湊的方法,於是選擇了HashAlgorithm。

命名空間:System.Security.Cryptography

使用方法:

HashAlgorithm sha = SHA256.Create();
byte[] result = sha.ComputeHash(dataArray);

可以把SHA256換成指定的加密方法,像是MD5、RIPEMD160、SHA512等等。

因為我把資料庫資料欄位設成nvarchar,還得用到byte[]和string的轉換,轉換方法也紀錄一下。

byte[] to string

string str = System.Text.Encoding.Default.GetString ( byteArray );

string to byte[]

byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); 

實作
這是我原本的user資料表,密碼是明碼,非常赤裸,處理一下密碼加密的部分吧。
https://ithelp.ithome.com.tw/upload/images/20201002/20130030sneDnSQkUS.png
把原本的資料表砍了,再把password欄位設到最大。
https://ithelp.ithome.com.tw/upload/images/20201002/20130030R2aH3AEVlT.png
我的程式碼:
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加回來。
https://ithelp.ithome.com.tw/upload/images/20201002/20130030wVkfvGyue4.png
資料庫內的儲存結果。
https://ithelp.ithome.com.tw/upload/images/20201002/20130030aS8xRK3DbQ.png
依序加入原本的user,結果如下圖。
https://ithelp.ithome.com.tw/upload/images/20201002/20130030bE3222IgsS.png


day26心得:
小時候學的密碼學和資訊安全課程,都有提到一些觀念,今天簡單實作的頗有種充實感,蠻愉快的。
啊整個參賽所Po的內容,都是我用過去大學所學習的知識,加上自己從網路資料中摸索的結果,如果有錯誤請告訴我,我會很感激你/images/emoticon/emoticon41.gif


上一篇
零經驗 .NET Core 30 DAY----- Day25 row column二維TO一維計算和實際應用
下一篇
零經驗 .NET Core 30 DAY----- Day27 利用Regular Expression做密碼原則判斷
系列文
零經驗ASP .NET Core 30 DAY全紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言