• scrypt加密password SCrypt对密码进行加密


    1、bcrypt相关描述

    bcrypt

    bcrypt是专门为密码存储而设计的算法,基于Blowfish加密算法变形而来,由Niels Provos和David Mazières发表于1999年的USENIX。
    bcrypt最大的好处是有一个参数(work factor),可用于调整计算强度,而且work factor是包括在输出的摘要中的。随着攻击者计算能力的提高,使用者可以逐步增大work factor,而且不会影响已有用户的登陆。
    bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。bcrypt也有广泛的函数库支持,因此我们建议使用这种方式存储密码。

    scrypt

    scrypt是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的。
    和上述两种方案不同,scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。

    https://baike.baidu.com/item/PBKDF2/237696?fr=aladdin

    2、新建项目ConsoleSCrypt,使用NuGet程序包管理器添加SCrypt

    3、Program.cs中添加如下代码:

    using CryptSharp.Utility;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleSCrypt
    {
        class Program
        {
            static void Main(string[] args)
            {
                #region SCrypt对密码进行加密及密码验证
                Console.WriteLine("SCrypt");
                string pwd = "SCrypt明文信息";
                //HashAlgorithm hash = HashAlgorithm.Create("MD5");
                HashAlgorithm hash = MD5.Create();
                byte[] ms5bytes = hash.ComputeHash(Encoding.UTF8.GetBytes(pwd));
                Console.WriteLine($"ms5bytes :{BitConverter.ToString(ms5bytes).Replace("-",string.Empty)}");
                byte[] salt = new byte[10];
                byte[] salt2 = new byte[4];
                RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
                rng.GetBytes(salt);
                rng.GetBytes(salt2);
                Console.WriteLine(BitConverter.ToString(salt2));
                byte[] result = SCrypt.ComputeDerivedKey(Encoding.UTF8.GetBytes(pwd), salt, 4, 8, 2, 2, 5);
                Console.WriteLine($"加密以后的密文:{BitConverter.ToString(result).Replace("-","").ToLower()}");
                #endregion
                Console.ReadLine();
            }
        }
    }

    4、运行结果:

     

  • 相关阅读:
    TCP和UDP的一些区别: TCP提供可靠传输的机制:
    rpc和 http的区别
    熔断原理与实现Golang版
    源码解读 Golang 的 sync.Map 实现原理
    mysql底层为啥用b 树不用红黑树_MySQL索引底层数据结构
    一条sql 查询语句是如何执行的
    网络相关知识
    为什么遍历 Go map 是无序的?
    Go语言 参数传递究竟是值传递还是引用传递的问题分析
    解决goland debug 调试问题 Version of Delve is too old for this version of Go
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/13203268.html
Copyright © 2020-2023  润新知