C# 中的哈希密码和盐密码

2023-12-04

我刚刚浏览了 DavidHayden 的一篇文章对用户密码进行哈希处理.

真的,我无法得到他想要达到的目标。

这是他的代码:

private static string CreateSalt(int size)
{
    //Generate a cryptographic random number.
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[size];
    rng.GetBytes(buff);

    // Return a Base64 string representation of the random number.
    return Convert.ToBase64String(buff);
}

private static string CreatePasswordHash(string pwd, string salt)
{
    string saltAndPwd = String.Concat(pwd, salt);
    string hashedPwd =
        FormsAuthentication.HashPasswordForStoringInConfigFile(
        saltAndPwd, "sha1");
    return hashedPwd;
}

是否还有其他 C# 方法可以对密码进行哈希处理并向其添加盐?


Update:如果您使用的是 .NET 6 或更高版本,请使用这个解决方案.

实际上,这有点奇怪,因为成员资格提供者将字符串转换放入配置文件中。哈希和盐是二进制 blob,不需要将它们转换为字符串,除非您想将它们放入文本文件中。

在我的书中,开始 ASP.NET 安全,(哦最后,一个给这本书拉皮条的借口)我做了以下事情

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
  HashAlgorithm algorithm = new SHA256Managed();

  byte[] plainTextWithSaltBytes = 
    new byte[plainText.Length + salt.Length];

  for (int i = 0; i < plainText.Length; i++)
  {
    plainTextWithSaltBytes[i] = plainText[i];
  }
  for (int i = 0; i < salt.Length; i++)
  {
    plainTextWithSaltBytes[plainText.Length + i] = salt[i];
  }

  return algorithm.ComputeHash(plainTextWithSaltBytes);            
}

盐的生成正如问题中的例子。您可以使用将文本转换为字节数组Encoding.UTF8.GetBytes(string)。如果您必须将哈希转换为其字符串表示形式,您可以使用Convert.ToBase64String and Convert.FromBase64String将其转换回来。

您应该注意,您不能在字节数组上使用相等运算符,它会检查引用,因此您应该简单地遍历两个数组来检查每个字节,从而

public static bool CompareByteArrays(byte[] array1, byte[] array2)
{
  if (array1.Length != array2.Length)
  {
    return false;
  }

  for (int i = 0; i < array1.Length; i++)
  {
    if (array1[i] != array2[i])
    {
      return false;
    }
  }

  return true;
}

Always每个密码使用新的盐。盐不必保密,可以与哈希本身一起存储。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的哈希密码和盐密码 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何用另一个响应替换窗口的 URL 哈希?

    我正在尝试使用替换方法更改哈希 URL document location hash 但它不起作用 function var anchor document location hash this returns me a string va
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • HttpUnit 是否已弃用/不活动/不支持?

    三年前 当我探索并研究 HttpUnit 时 我很喜欢它的功能 尽管在三年没有跟踪它之后 当我向我的同事建议基于它的解决方案时 他告诉我它已被弃用 apache 状态表明它处于活动状态 我在哪里找不到这是否属实 如果这是真的 我会感到震惊
  • Mac OS 和 Windows 之间的 exp() 精度

    我在这里得到了一个代码 当我在Win和Mac OS上运行它们时 结果的精度是不同的 任何人都可以帮忙吗 const double c 1 exp 2 0 double x 139 0 5 2282 0 x 1 exp 2 1 x c 结果都
  • 如何在数据库(Mongo)中进行左连接[重复]

    这个问题在这里已经有答案了 我是蒙戈新手 请帮我如何在 Mongo 中进行左连接 SQL语句 Select from TableA left Join TableB on TableA col1 TableB col1 AND TableB
  • 我可以继承 OpenERP 中的标准报告吗?

    我想更改 OpenERP 6 1 中的采购订单报告 我是否必须进入并更改购买模块 或者我可以创建一个新模块来继承标准报告并覆盖一些详细信息 您无法完全继承另一个报告并仅覆盖一些详细信息 但您可以替换标准报告并使其所有现有链接启动您的新报告
  • 在python中创建一个列来对数值进行分类

    我有一个名为 df 的 python 数据框 其中包含客户的 BMI 作为 bmi 列中的数字 我想在数据框中添加一个新列 称为 bmi cat 它是基于其数值的 BMI 类别 即 这就是我尝试过的 但没有成功 它不喜欢使用 for df
  • 如何从学说查询生成器获取部分结果

    我有一个产品实体 其中有一个数组作为属性 ORM OneToMany targetEntity Shopious MainBundle Entity ProductPicture mappedBy product cascade persi
  • 如何动态添加多个句柄到 jQuery 滑块

    我想做这个 在某些事件上向 jQuery 滑块添加句柄 该句柄应该有一个 id 以便当它滑动时 我可以访问它的值 有什么想法如何做到这一点 Here是 JSfiddle 中的代码 其中实现了带有两个手柄的滑块 我需要做的就是通过触发某些事件
  • 在堆上创建结构体?

    我被指示通过在保存源副本的堆上创建一个 String 结构来编写模型 strdup 我想我已经成功编码了 strdup 但我不确定我是否已经创建堆上的结构体 typedef struct String int length int capa
  • 带有子网格和本地数据的 JqGrid 在 IE9 中不起作用 - 抛出 - “SCRIPT600:此操作的目标元素无效”

    我是 JQGRID 的新手 我使用的是 4 7 1 版本 我正在尝试使用 SUBGRID 创建 JQGRID 该代码在 Google Chrome 中按预期工作 但我在 IE9 中收到下面提到的错误 SCRIPT600 Invalid ta
  • 将 .RData 文件加载到会话中,但在 Shiny 中未加载任何对象

    我在 R 中得到了分析结果 一个名为obj 并将其保存为 RData 文件obj result RData 现在在闪亮 在年初ui R文件 我把load obj results RData 这样每次运行 Shiny 时 这个对象都可以加载到
  • 手动滚动两个显示相同内容的 UICollectionView

    正如标题所示 我有一个UIViewController有两个UICollectionViews它们以水平方式显示相同的内容 主图一次显示一张照片 大拇指图一次显示多张照片 我已经覆盖了UIScrollViewDelegate方法并添加了一些
  • 当 CrawlerProcess 运行两次时,Scrapy 会引发 ReactorNotRestartable

    我有一些代码看起来像这样 def run spider name settings runner CrawlerProcess settings runner crawl spider name runner start return Tr
  • 串行化套接字

    我尝试序列化套接字 但它不起作用 正确的方法是什么 public class MySocket implements Serializable private Socket socket public MySocket Socket soc
  • 使用 dir 搜索文件 - 多次命中

    我有一个宏 它遍历文件夹并使用 dir 函数来查找活动文件夹中是否存在文件 并将文件名放入单元格中 问题是可能有两个或多个文件满足搜索 Dir subfolder Kommunesvar 如果有两个以 Kommunesvar 开头的文件 如
  • 为什么我的 li 元素之间有空格? [复制]

    这个问题在这里已经有答案了 我有一个水平显示的项目列表 我想在每个里周围创建一个边框 并使它们彼此相邻地突出 我创建了一个小测试来说明问题 在这里看到 ul class dashboard inline links li a href Oc
  • 复杂的数据库操作

    我为我的 ASP NET 应用程序绘制了一个非常简单的数据库设计 在一些帮助下 我成功地实现了我的设计 但我想将数据插入到该表中并从中检索 我的应用程序中一个非常重要的功能将需要某个记录的所有 7 个表中的所有信息 有时我需要让我的应用程序
  • HttpClient GetAsync 未按预期工作

    当使用 Postman 测试我的 Web API 时 我的 API 执行得很好 当涉及到运行代码时HttpClient在我的客户端应用程序中 代码执行时没有错误 但在服务器上没有预期的结果 可能会发生什么 从我的客户端应用程序 privat
  • 传递 SqlConnection

    我创建了一个 TransactionScope 并在该范围内在数据库中创建和更新了各种项目 在此过程中 我对数据库进行了大量调用 最初 我在 TransactionScope 的开头打开了一个 SqlConnection 并将其传递给任何进
  • SwiftUI hidesBottomBarWhenPushed 等效吗?

    我试图隐藏我的TabView当我在我的视图中推送一个新视图时NavigationView但目前看来没有办法做到这一点 我在互联网上看到了很多东西 但似乎没有什么适合我 默认情况下 我的代码如下所示 struct ContentView Vi
  • C# 中的哈希密码和盐密码

    我刚刚浏览了 DavidHayden 的一篇文章对用户密码进行哈希处理 真的 我无法得到他想要达到的目标 这是他的代码 private static string CreateSalt int size Generate a cryptog