.Net实现SCrypt Hash加密

方案1 (加密后存储“算法设置”、“盐(随机值)”、“Hash值”,以“$”分隔):

//Nuget引入SCrypt.NET库

using Org.BouncyCastle.Crypto.Generators;
using Scrypt;
using System;
using System.Security.Cryptography;

namespace XXX.Common.Helpers;

public static class SCryptHelper
{

    //该库的SCrypt加密会得到包含“算法设置、盐(是个随机数)、Hash”一起的值,并以“$”分隔

    //由于每次盐是随机产生的,所以每次对同一明文加密得到的值并不相同,

    //但由于加密后的信息存储了算法设置及盐信息,所以Compare方法中可以利用这些信息再次对明文进行运算而得到相同的Hash值进行匹配

    public static string Encrypt(string password)
    {
        ScryptEncoder encoder = new ScryptEncoder();
        return encoder.Encode(password);      //得到包含“算法设置、盐(是个随机数)、Hash”一起的值,并以“$”分隔  
    }

    public static bool Verify(string password, string hashedPassword)
    {
        ScryptEncoder encoder = new ScryptEncoder();
        bool areEquals = encoder.Compare(password, hashedPassword);
        return areEquals;
    }

}

//该方案采用的即是以下存储方案(由于Salt是随机的,因此需要保存起来):

//以下来自:https://cryptobook.nakov.com/mac-and-key-derivation/scrypt

方案2 (加密后只存储“Hash值”):

//Nuget引入SCrypt库

using CryptSharp.Utility;
using System;
using System.Text;

namespace XXX.Common.Helpers;

public static class SCryptHelper
{

    //该方案使用Scrypt库自己设置加密参数,

    //由于使用固定的“算法设置”、并可以传入相同的参数值作为“盐”,

    //因此无需存储算法设置和盐信息,加密后只得到加密参数中指定长度的Hash值,

    public static string Encrypt(string password, string salt)
    {           
        byte[] saltArray = Encoding.UTF8.GetBytes(salt);
        byte[] result = SCrypt.ComputeDerivedKey(Encoding.UTF8.GetBytes(password), saltArray, 256, 8, 1, 2, 32);

        //参数: key,salt,cpuCost,memoryBlockSize,parallel,maxThreads,derivedKeyLength),

        //详见以下SCrypt.ComputeDerivedKey方法说明截图


        string hashResult = BitConverter.ToString(result).Replace("-", "").ToLower();
        return hashResult;        //返回hashResult长度为64(32*2,即以上参数指定的32字节并以每字节2位的16进制表示)
    }

    public static bool Verify(string password, string salt, string hashedPassword)
    {
        var hash = Encrypt(password, salt);
        return hash.Equals(hashedPassword, StringComparison.OrdinalIgnoreCase);
    }
}

//该方案加密后只返加Hash值,只需存储该Hash值,每次用相同的Salt计算后匹对

//以下来自:https://8gwifi.org/scrypt.jsp

SCrypt.ComputeDerivedKey方法说明:

参考:

  • https://www.oomake.com/question/1177086
  • https://blog.csdn.net/LongtengGensSupreme/article/details/107001127
  • https://blog.csdn.net/LongtengGensSupreme/article/details/107002537

相关知识(过往相关博文):

  • 浅述.Net中的Hash算法(顺带对称、非对称算法)_nthash 算法-CSDN博客
  • 密钥派生算法介绍 及 PBKDF2(过时)<Bcrypt(开始淘汰)<Scrypt< Argon2(含Argon2d、Argon2i、Argon2id)简介_bcrypt scrypt-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8.让画面动起来

一、Unity Shader中的内置变量(时间篇) 动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化的同时也可以随之变化。Unity shader提供了一系列关于时间的内置变量来允许我们方便地在Shader中访问运行时间,实现各种动画…

暴雨推出X705显示器:23.8英寸100Hz IPS屏

IT资讯 6月 7 日消息,日前,暴雨发布了一款 23.8 英寸 IPS 显示器,直屏、支持 100Hz 刷新率。 据官方介绍,X705 显示器分辨率为 19201080,亮度为 300 尼特(典型值),对比度 1000:1&…

从Log4j和Fastjson RCE漏洞认识jndi注入

文章目录 前言JNDI注入基础介绍靶场搭建漏洞验证注入工具 log4j RCE漏洞分析漏洞靶场检测工具补丁绕过 Fastjson RCE漏洞分析漏洞靶场检测工具补丁绕过 总结 前言 接着前文的学习《Java反序列化漏洞与URLDNS利用链分析》,想了解为什么 Fastjson 反序列化漏洞的利用…

关于用宽带(拨号)连接VPN无法上网,但是wifi或者热点就可以的问题

参考链接:https://zhuanlan.zhihu.com/p/580929250https://zhuanlan.zhihu.com/p/580929250 https://blog.csdn.net/Yaoyao2024/article/details/132245249文章浏览阅读10w次,点赞161次,收藏515次。很多同学在学习访问学校提供的资源时或者一…

队列和栈的实现

文章目录 队列队列的定义队列常见的基本操作队列的顺序存储结构实现 栈栈的定义栈的常见基本操作栈的顺序存储实现 栈的链式存储实现 队列 队列的定义 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先…

Vitis HLS 学习笔记--聚合与解聚-AXI主接口

目录 1. 简介 2. 用法及语法 3. 详细解读 4. 总结 1. 简介 在使用 Vitis HLS 工具进行硬件设计时,如果你在接口上使用了结构体,工具会自动把结构体里的所有元素组合成一个整体。就像把一堆零件组装成一个玩具一样。这样做的好处是,数据可…

【西瓜书】大题

1.线性回归 思路:ywxb,w为一维数组,求均方误差MSE,对w和b分别求偏导为0得到关于w和b的闭式求解。预测第十年的代入ywxb求解即可。 2.查准率、查全率 思路:先计算每个算法测试结果的混淆矩阵,再根据混淆矩阵…

pyrouge(ROUGE-1.5.5)的安装步骤和使用说明(适用于Linux 系统)

摘要:本文讲解了如何配置和使用文本摘要的评价指标ROUGE(linux 系统)。 ✅ NLP 研 1 选手的学习笔记 简介:小王,NPU,2023级,计算机技术 研究方向:摘要生成、大语言模型生成 文章目录 一、为啥要写这篇博客&…

问题汇总:MPU6050(软件iic)

以下为个人问题汇总,排查点汇总可能大有缺陷,如有错误,欢迎指正。 排查点汇总 检查软件iic的时序操作用示波器或逻辑分析仪检查波形 无法使用逻辑分析仪进行I/O引脚波形分析 充当SDA、SCL的引脚要配置为推挽输出; 另外,逻辑分…

挑战绝对不可能:再证有长度不同的射线

黄小宁 一空间坐标系中有公共汽车A,A中各座位到司机处的距离h是随着座位的不同而不同的变数,例如5号座位到司机处的距离是h3,…h5,…。A移动了一段距离变为汽车B≌A,B中5号座位到司机处的距离h’h3,…h’h5…

LLVM Cpu0 新后端 系列课程总结

想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

测试与开发

目录 按照测试目标分类 界面测试 功能测试 性能测试 可靠性测试 安全性测试 易用性测试 按照执行方式分类: 测试方法 白盒测试 语句覆盖 条件覆盖 判定条件覆盖 条件组合覆盖 路径覆盖 黑盒测试 灰盒测试 按照测试阶段分类 单元测试 集成测试 …

【iOS】界面推出的方法

【iOS】界面推出的方法 在学习过程中我们发现在iOS中有两种界面推出的方法:push 和 present这两种方法都可以用来推出一个新的界面 但是这两者是存在区别的 push 方法是通过 UINavigationController 进行导航,新的视图控制器会被压入导航栈中,可以跨级…

写给大数据开发,如何去掌握数据分析

这篇文章源于自己一个大数据开发,天天要做分析的事情,发现数据分析实在高大上很多,写代码和做汇报可真比不了。。。。 文章目录 1. 引言2. 数据分析的重要性2.1 技能对比2.2 业务理解的差距 3. 提升数据分析能力的方向4. 数据分析的系统过程4…

前端 JS 经典:Promise 详解

1. Promise 由来 在以前我们实现异步是用的回调函数,当一个异步请求需要依赖上一个异步请求返回的结果的时候,就会形成如下这种的调用结构。 请求1(function (结果1) {请求2(function (结果2) {请求3(function(结果3)) {请求4(function(结果4) {})}});…

Windows下载安装RabbitMQ客户端(2024最新篇)

文章目录 RabbitMQ认知RabbitMQ下载RabbitMQ安装 更多相关内容可查看 RabbitMQ认知 定义:RabbitMQ是一个消息中间件,它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递…

免费!GPT-4o发布,实时语音视频丝滑交互

We’re announcing GPT-4o, our new flagship model that can reason across audio, vision, and text in real time. 5月14日凌晨,OpenAI召开了春季发布会,发布会上公布了新一代旗舰型生成式人工智能大模型【GPT-4o】,并表示该模型对所有免费…

JDBC简介以及快速入门

这些都是JDBC提供的API 简介 每一个数据库的底层细节都不一样 不可能用一套代码操作所有数据库 我们通过JDBC可以操作所有的数据库 JDBC是一套接口 我们自己定义了实现类 定义实现类 然后就能用Java操作自己的数据库了 MySQL对于JDBC的实现类 就是驱动 快速入门 创建新的项…

vscode copilot git commit 生成效果太差,用其他模型替换

问题 众所周知,copilot git commit 就像在随机生成 git commit 这种较为复杂的内容还是交给大模型做比较合适 方法 刚好,gitlens 最近开发了 AI commit的功能,其提供配置url api可以实现自定义模型 gitlens 只有3种模型可用&#xff1a…

【Python】在【数据挖掘】与【机器学习】中的应用:从基础到【AI大模型】

目录 💗一、Python在数据挖掘中的应用💕 💖1.1 数据预处理💞 💖1.2 特征工程💕 💗二、Python在机器学习中的应用💕 💖2.1 监督学习💞 💖2.2…