安全防禦之加鹽慢哈希加密

彩虹表的反推,使md5加密也不安全了,因此一些的程序員想出了個辦法,即便用戶的密碼很短,只要我在他的短密碼後面加上一段很長的字符,再計算 md5 ,那反推出原始密碼就變得很是困難了。加上的這段長字符,咱們稱爲鹽(Salt),經過這種方式加密的結果,咱們稱爲 加鹽 Hash 。好比:md5(md5(password)+salt)html

 
可是這種也不是特別安全,假如攻擊者拿到了salt,而後窮舉出6位密碼的全部md5(md5(password)+salt)值,那麼依舊會被破解,因此更安全的一種方法就是加鹽慢哈希加密。
 
所謂慢哈希,其實就是指執行這個哈希函數很是慢,這樣暴力破解須要枚舉遍歷全部可能結果時,就須要花上很是很是長的時間。最好對不一樣用戶的密碼隨機生成不一樣的salt,salt庫和密碼庫分離開。
 
代碼
    class Program
    {
        static void Main(string[] args)
        {
            string pwd = "123456";
            string pwdMd5 = Md5Encryption(pwd);
            string salt = Guid.NewGuid().ToString("N");
            string pwdSlowHash = GetSlowHashPWD(pwdMd5, salt);
            Console.WriteLine("鹽值:" + salt + " 加密後:" + pwdSlowHash);
            Console.ReadKey();

        }

        /// <summary>
        /// md5加密
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string Md5Encryption(string input)
        {
            byte[] result = Encoding.Default.GetBytes(input);   
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] output = md5.ComputeHash(result);
            return BitConverter.ToString(output).Replace("-", "");  
        }

        /// <summary>
        /// 慢哈希加密
        /// </summary>
        /// <param name="passwordMd5"></param>
        /// <param name="salt"></param>
        /// <returns></returns>
        internal static string GetSlowHashPWD(string passwordMd5, string salt)
        {
            int iterations = 1000;//密碼慢哈希迭代次數
            byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
            var pbkdf2 = new Rfc2898DeriveBytes(passwordMd5.ToUpper(), saltBytes, iterations);
            //用密碼、salt 值和迭代次數返回僞隨機密鑰。 
            byte[] keyBytes = pbkdf2.GetBytes(16);
            return BitConverter.ToString(keyBytes).Replace("-", "");

        }
    }

 

 

參考:http://www.jianshu.com/p/d3f5aab48158linux

        https://linux.cn/article-2722-2.html程序員

相關文章
相關標籤/搜索