当前位置: 首页 > news >正文

.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博客

相关文章:

  • Kafka面试题及答案
  • 【MySQL数据库】:MySQL索引特性
  • 纯理论容器实现的原理
  • 天才程序员周弈帆 | Stable Diffusion 解读(二):论文精读
  • React Hooks 封装可粘贴图片的输入框组件(wangeditor)
  • MPC+WBC多任务优先级控制例子
  • Ubuntu 22.04安装cuda及Pytorch教程
  • 刚刚❗️德勤2025校招暑期实习测评笔试SHL测评题库已发(答案)
  • 快速安装Windows和Ubuntu双系统
  • 同盾中文点选验证码识别方法
  • 【python/pytorch】已解决ModuleNotFoundError: No module named ‘torch‘
  • 【Python入门与进阶】常见问题与解决方法
  • 服务器数据恢复—强制上线raid5阵列离线硬盘导致raid不可用的数据恢复案例
  • 双Token方案实现Token自动续期(基于springboot+vue前后端分离项目)
  • 利用ffmpeg把视频分解成图片(每秒x张图)再图片合成视频
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • ESLint简单操作
  • Git初体验
  • Kibana配置logstash,报表一体化
  • opencv python Meanshift 和 Camshift
  • 漂亮刷新控件-iOS
  • 实习面试笔记
  • 实战|智能家居行业移动应用性能分析
  • 学习笔记TF060:图像语音结合,看图说话
  • 移动端解决方案学习记录
  • 自制字幕遮挡器
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • !!Dom4j 学习笔记
  • !$boo在php中什么意思,php前戏
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #Lua:Lua调用C++生成的DLL库
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #前后端分离# 头条发布系统
  • (20)docke容器
  • (floyd+补集) poj 3275
  • (LeetCode 49)Anagrams
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (ros//EnvironmentVariables)ros环境变量
  • (二)原生js案例之数码时钟计时
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (剑指Offer)面试题34:丑数
  • (离散数学)逻辑连接词
  • (篇九)MySQL常用内置函数
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • *p++,*(p++),*++p,(*p)++区别?
  • .htaccess配置常用技巧
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET 反射的使用
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .NetCore项目nginx发布