zoukankan      html  css  js  c++  java
  • 安全防护之加盐慢哈希加密

    彩虹表的反推,使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

  • 相关阅读:
    Ng-model undefined in the controller
    使用nvm进行node多版本管理
    AngularJS内置指令
    angularjs ng-switch
    Interpreting NotifyCollectionChangedEventArgs zz
    XAML控件不可访问,它具有一定的保护级别
    WPF RadioButton的绑定
    WPF中的ObservableCollection数据绑定
    C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?zz
    python 获取mac地址zz
  • 原文地址:https://www.cnblogs.com/zhangchengye/p/6323409.html
Copyright © 2011-2022 走看看