安全防护之加盐慢哈希加密

彩虹表的反推,使md5加密也不安全了,所以一些的程序员想出了个办法,即使用户的密码很短,只要我在他的短密码后面加上一段很长的字符,再计算 md5 ,那反推出原始密码就变得非常困难了。加上的这段长字符,我们称为盐(Salt),通过这种方式加密的结果,我们称为 加盐 Hash 。比如:md5(md5(password)+salt)

 
但是这种也不是特别安全,假如攻击者拿到了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/d3f5aab48158

        https://linux.cn/article-2722-2.html

posted @ 2017-01-20 17:25  风吹云东星不动  阅读(2764)  评论(0编辑  收藏  举报