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

C# 中使用Hash用于密码加密

通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。他最大的特点就是唯一性,一旦大数据发生了变化,哪怕是一个微小的变化,他的哈希值也会发生变化。类似于DNA,既然是DNA,那就保证了没有两个数据的哈希值是完全相同的。

哈希值的作用:哈希值,即HASH值,是通过对文件内容进行加密运算得到的一组二进制值,主要用途是用于文件校验或签名。正是因为这样的特点,它常常用来判断两个文件是否相同。

比如,从网络上下载某个文件,只要把这个文件原来的哈希值同下载后得到的文件的哈希值进行对比,如果相同则表示两个文件完全一致,下载过程没有损坏文件。而如果不一致,则表明下载得到的文件跟原来的文件不同,文件在下载过程中受到了损坏。

using System.Security.Cryptography;
using System.Text;

namespace WebApplicationPwd;

public static class PasswordHelper
{
    public static string Encryption(string pwd, string? salt)
    {
        if (string.IsNullOrEmpty(salt))
        {
            var pwdBytes = Encoding.ASCII.GetBytes(pwd);
            var pwdHashBytes = MD5.HashData(pwdBytes);
            return Convert.ToBase64String(pwdHashBytes);
        }
        else
        {
            //var pwdBytes = Encoding.ASCII.GetBytes(pwd + salt);
            //var pwdHash256Bytes = SHA256.HashData(pwdBytes);
            //return Convert.ToBase64String(pwdHash256Bytes);


            #region PBKDF2+salt
            var saltBytes = Encoding.ASCII.GetBytes(salt);
            using var pkdf2 = new Rfc2898DeriveBytes(pwd, saltBytes, 1000);
            var pwdHashRfcBytes = pkdf2.GetBytes(32);
            return Convert.ToBase64String(pwdHashRfcBytes);
            #endregion

            #region Bcrypt  & Argon2  不需要加盐   
            //   <PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />

            //return BCrypt.Net.BCrypt.HashPassword(pwd);
            #endregion
        }
    }


    public static bool VerifyPassword(string pwd, string hashPwd, string salt)
    {
        return Encryption(pwd, salt) == hashPwd;
    }

    public static string CreateSalt()
    {
        var randomNu = RandomNumberGenerator.GetBytes(32);
        return Convert.ToBase64String(randomNu);
    }
}


http://www.kler.cn/a/519797.html

相关文章:

  • [BSidesCF 2020]Had a bad day1
  • 56. 合并区间
  • (1)STM32 USB设备开发-基础知识
  • 单片机内存管理剖析
  • 云计算的概念与特点:开启数字化时代的新篇章
  • 安宝特方案 | AR在供应链管理中的应用:提升效率与透明度
  • AI Agent的多轮对话:提升用户体验的关键技巧
  • Linux之Tcp粘包笔记
  • Oracle之Merge into函数使用
  • 蓝桥杯LQ1044 求完数
  • 不同路径(62)
  • 机器学习 ---逻辑回归
  • 手撕B-树
  • python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算
  • 修改 Go 版本后不生效?深入排查与解决方案
  • 代码随想录刷题day16|(哈希表篇)349.两个数组的交集
  • LeetCode hot 热题100 二叉树的层序遍历
  • ollama部署及实践记录,虚拟环境,pycharm等
  • 树莓派安装步骤
  • 【win11】解决msrdc.exe窗口启动导致周期性失去焦点
  • 分布式微服务系统简述
  • 基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)
  • 2025年新开局!谁在引领汽车AI风潮?
  • C语言精粹:深入探索字符串函数
  • C++11新特性之auto与decltype(总结)
  • Java 基础知识