左耳聽風 第三十一週

左耳聽風 第三十一週

每週完成一個ARTS: 每週至少做一個 leetcode 的算法題、閱讀並點評至少一篇英文技術文章、學習至少一個技術技巧、分享一篇有觀點和思考的技術文章。(也就是 Algorithm、Review、Tip、Share 簡稱ARTS)

Algorithm

繼續按順序來完成「LeetCode」前 200 題

LeetCode13. 羅馬數字轉整數

LeetCode14. 最長公共前綴

review

What devs need to know about Encoding / Encryption / Hashing / Salting / Stretching 「關於編碼、加密、哈希、加鹽、祕鑰延伸」

作者對數據加密方面的知識進行了普及:

首先是指出編碼和加密的不同。編碼 ,是對特定代碼的加工。而「加密」,是把數據轉化爲特定格式的過程,加密需要鑰匙來加鎖或解鎖,只有少部分人可以看到真實的數據(例如:管理員),大部分人只能看到加密的文本。

加密又可以分爲兩大類:Symmetric Key Encryption(對稱祕鑰加密),即加密和解密用相同的鑰匙,最常用的加密方式;Asymmetric Key Encryption(非對稱祕鑰加密),加密和解密用不同的鑰匙,最著名的應用就是 HTTPS 。

非對稱加密」常用的方式就是 hash + salt,哈希函數可以幫助我們生成定長的加密數據,但是單純的 hash 函數可以被黑客用彩虹表等破解,這就需要我們 salting(加鹽) 了,即在原始數據中摻雜其他數據,使得黑客不能直接通過「撞庫」來得到明文密碼以及加密的方式。

Stretching 祕鑰延伸,是進一步加密,最簡單的實踐就是在加密後,再對已加密的數據重複加密,最終得出複雜的加密文件,若黑客想要破解密碼,就需要在原有加密時間上花上指數倍時間破解,甚至在理論時間上無法破解。

說了這麼多,爲什麼要對數據庫加密?直接目的就是抵禦「黑客」的攻擊,避免數據庫泄露,造成公司以及個人的財務以及隱私的損失。而加密的實質是給黑客增加解密的門檻,讓黑客在理論上無法解密。

Tip

根據 Review 的文章看了一下 C# SHA256 的實踐,將 salt 作爲加密的鑰匙對文本進行加密,密碼驗證的時候,實際上是比較二者轉換的 hash 值是否一致。


public static string Encrypt(string encryptStr,string salt)
        {
            var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(salt)); // salt 轉換爲字節,作爲加密的鑰匙

            return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(encryptStr)));
        }
        
static void Main(string[] args)
        {
            string salt = "salt"; // 鹽,也是鑰匙
            string password = "admin123"; // 明文密碼

            string newPwd = newPassword(salt, password); // 存儲在數據庫的加密文本

            Console.Write("判斷密碼判斷是否一致: ");
            var pwd = Console.ReadLine();
            Console.WriteLine(newPassword(salt, pwd).Equals(newPwd)); // 根據 SHA256 生成的加密文本是否一致來判斷密碼是否正確
        }

share

ASP.NET MVC 入門

如何入門一門新語言或是一門新技術?

找到適合自己的學習方式。看視頻、看專欄、看博客、看紙質書都是不錯的學習方式,找到自己喜歡的,投入時間去學習。

系統性、整體性的學習。可以以官方的參考文檔文檔爲主,再參考一些別人的路線圖(思維導圖),有條件的儘量用英文在谷歌搜索答案,CSDN 上的許多博客很多時候都有沒有講清楚問題。系統性、整體性的瞭解知識可以讓你在出現問題的時候快速定位,更好的去解決問題。

看源碼,多實踐。編程是理工科的學科,需要通過實踐才能發現問題。先學習別人的源碼,在實踐中吸取知識,會讓你真正的對某些概念有所瞭解,BUG 的出現並全是壞事,這只是說明你對某一塊的知識尚未理解,攻克它,你會有新的收穫。當然你不能一味的死磕,可以在網上搜索自己出現的問題,看看別人是怎麼解決到。如果找不到,說明你還沒找準問題,那就需要找人幫忙了,Stack Overflow 可以幫你解決問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章