从密码字符串派生加密密钥和 IV 时,可以使用密码的 SHA1 哈希值作为盐吗?

2023-11-23

我在用着Rfc2898DeriveBytes从用户提供的字符串密码安全地生成加密密钥和初始化向量,以与对称加密(例如 AesManaged)一起使用。

我将密码的 SHA1 哈希值作为盐参数Rfc2898DeriveBytes。这可以吗?如果没有,那么我应该从哪里获取盐?解密时我需要同样的盐,对吧?所以我必须将它存储在未加密的地方 - 不安全的地方。如果我必须安全地存储它,那么它就变成了另一个“密码”,不是吗?

void SecureDeriveKeyAndIvFromPassword(string password, int iterations, 
    int keySize, int ivSize, out byte[] key, out byte[] iv)
{
    // Generate the salt from password:

    byte[] salt = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(password));

    // Derive key and IV bytes from password:

    Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, salt, iterations);

    key = derivedBytes.GetBytes(keySize);
    iv = derivedBytes.GetBytes(ivSize);
}

我见过使用恒定(硬编码)盐,并且我见过人们抱怨它。我认为从密码中获取盐会是更好的主意,但我不确定这是否是最佳解决方案。

不久,我有一个需要加密的文件,以及用户输入的密码字符串。我该如何正确使用Rfc2898DeriveBytes导出安全加密密钥和 IV?

Thanks.

EDIT:

感谢您的回答。我现在明白,盐的主要(也许只是?)目的是使彩虹表的生成变得不可能 - 您无法预先生成“P@$$w0rd”的哈希值,因为它对于每种可能都有不同的哈希值盐值。我完全理解这一点,但是......这真的与对称加密相关吗?我没有将哈希值存储在任何地方,对吗?因此,即使攻击者拥有所有可能的密码组合的彩虹表,他也无能为力,对吗?

所以,我现在的问题是:与使用密码派生(甚至硬编码)盐相比,在每个加密操作中使用随机盐是否有任何优势,与对称加密算法一起使用时(如 .NET 的 AesManaged)?


盐应该是每个密码都是唯一的,这意味着为每个要散列的密码创建一个随机密码。盐是not一个秘密,可以用您计算的哈希值存储纯文本。

salt 的想法是,攻击者无法使用预先构建的彩虹表来获取密码。他必须为每个密码单独构建这样一个彩虹表,这是没有意义的。在找到匹配项之前,暴力破解会更容易。

有一个例子MSDN盐是从哪里获得的操作系统的随机源。这是您能做的最好的事情,为了获得安全的盐,不要从您的密码中获取它。

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

从密码字符串派生加密密钥和 IV 时,可以使用密码的 SHA1 哈希值作为盐吗? 的相关文章

  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 从 HTTPS 重定向到 HTTP 的安全问题?

    我在一些博客上读过 抱歉没有提及参考资料 但我找不到了 如果您将用户从 https 页面重定向到 http 页面 您将失去保护网站安全的所有工作 那么 有人可以向我解释一下在以下情况下我是对还是错 在登录页面上使用 https 然后使用 h
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • switch语句:default必须是最后一种情况吗?

    考虑以下switch陈述 switch value case 1 return 1 default value fall through case 2 return value 2 该代码可以编译 但它对于 C90 C99 有效 定义的行为
  • 将大图像加载到位图中?

    我正在尝试制作一个显示来自相机的图像的基本应用程序 但是当我尝试使用 sdcard 加载 jpg 时BitmapFactory decodeFile 它返回 null 它不会给出我觉得奇怪的内存不足错误 但完全相同的代码在较小的图像上运行良
  • 文件名包含空格的 Shell 脚本问题

    我知道处理文件名中空格的一种技术是用单引号将文件名引起来 为什么下面的代码 echo sh 可以在包含带空格的文件名的目录上工作 但是程序 ls sh 却不起作用 唯一的区别是 echo 被 ls 替换了 echo sh bin sh fo
  • Mongoose 模型枚举的自定义错误消息

    我想自定义我的 Mongoose 模型生成的验证消息 我倾向于不直接将我的验证 例如必需的 放在模式对象上 因为没有自定义错误消息的自由 例如 sourceAccountId type Schema ObjectId require tru
  • 禁用“单页”网络应用程序的惯性滚动

    我正在尝试创建一个 单页 网络应用程序 其风格与 Gmail Google Docs Evernote 等相同 在这些应用程序中 允许惯性滚动拉动页面是没有意义的 这是我尝试禁用的效果的视频 http tinypic com r 2eb6f
  • AWS ec2 根卷增加:在 aws ubuntu 实例上扩展弹性根卷不起作用

    我已经关注了用于扩展弹性根卷的 aws 文档我的根卷大小从 8 GB 增加到 20 GB 我确认使用lsblk NAME MAJ MIN RM SIZE RO TYPE MOUNTPOINT xvda 202 0 0 20G 0 disk
  • 将 xtable 输出拆分为子表

    有一个关于在有多列时将 xtable 与 Sweave 一起使用的问题 我正在处理的表格大约有 25 列和 5 行 确切的列数未知 因为它是动态的 当我跑步时说 表 1 我得到的表格基本上超过了页面长度 ColA ColB ColC Row
  • XCHG 在 Intel 汇编语言中如何工作?

    如何xchg以下代码中的指令工作 已知arrayD是一个 DWORD 数组 1 2 3 mov eax arrayD eax 1 xchg eax arrayD 4 eax 2 arrayD 2 1 3 为什么后面不是数组 1 1 3xch
  • 正则表达式匹配单个点而不是两个点?

    尝试创建用于电子邮件地址检查的正则表达式模式 这将允许使用点 但如果有多个点相邻 则不允许使用点 应匹配 电子邮件受保护 不应该匹配 电子邮件受保护 现在我知道互联网上有数千个用于电子邮件匹配的示例 因此请不要向我发布包含完整解决方案的链接
  • Matlab - save(int2str(i), x) 不起作用 - 参数必须包含字符串

    我有一个循环正在生成一些数据 在某些情况下我想保存数据 因此我有 save int2str i x 这不起作用并显示以下消息 Error using gt save Argument must contain a string 我究竟做错了
  • 无法 Dockerize Vite React-Typescript 项目

    我正在尝试对 Vite React Typescript 样板设置进行 dockerize 但无法连接到容器 安装了 vite react typescript 样板 npm init vite latest vite docker dem
  • 返回 http 200 OK,响应正文中有错误

    我想知道返回是否正确HTTP 200 OK当服务器端发生错误时 错误详细信息将包含在响应正文中 Example 我们正在发送HTTP GET 服务器端发生了一些意想不到的事情 服务器返回HTTP 200 OK响应中存在错误的状态代码 例如
  • 如何通过给出私钥获得RSA公钥?

    我正在寻找一个 Java 函数 它将获取 RSA 私钥并返回正确的 RSA 公钥 或者 是否有一个函数可以告诉我们 RSA 私钥 公钥是否有效 如果您有私钥作为RSA私钥对象 您可以获得公共指数以及模数 然后你可以像这样创建公钥 RSAPu
  • 如何在 django 的 ModelForm 中使用 DatePicker?

    我正在使用 django 3 0 我试图在我的 ModelForm 中显示一个日期选择器小部件 但我不知道如何 我能得到的只是文本字段 我尝试寻找一些解决方案 但找不到任何解决方案 这就是我的模型和 ModelForm 的样子 class
  • 在 AngularJS 自定义验证指令中调用异步服务

    我有一个自定义验证指令 验证用户名尚不存在 验证使用 http服务询问服务器用户名是否存在 因此返回的是一个promise对象 这对于验证来说非常有效 当用户名已被使用时 表单无效并包含 myform error usernameVerif
  • 如何将 Angular Promise 转换为 jquery 延迟对象

    我想将承诺从我的模块 sdk 返回到非角度 javascript 例如 如果我将 Promise 返回给 jquery 我可能应该发送 jquery 延迟对象 如何将 Angular Promise 转换为 jquery Promise D
  • Xcode 6 iPhone 模拟器应用程序支持位置

    在 Xcode 6 中 我有一个正在使用 Core Data 的应用程序 但 iOS 8 iPhone 模拟器的应用程序支持中没有文件夹 我的文件和 Core Data sqlite 数据库存储在哪里 模拟器目录已随 Xcode 6 bet
  • 操作栏 Sherlock SearchView 单击时不会展开

    我有一个 Sherlock 片段活动 我使用片段寻呼机适配器从中设置不同的 Sherlock 片段 现在 为了在每个片段中显示搜索视图 我已将此方法放置在片段的 onCreate 中 此方法将在片段的 ActionBar 中显示菜单项 Ov
  • 为什么使用“g++”而不是“gcc”来编译 *.cc 文件?

    我编译了一个使用的库g 代替gcc 一开始我以为源代码是用C 写的 后来发现 cc文件里并没有任何C 代码 为了确认这一点 我更换了g 在原始 makefile 中gcc 而且我仍然得到了正确的程序 解释是什么 我不是第一次遇到这样的情况
  • 从密码字符串派生加密密钥和 IV 时,可以使用密码的 SHA1 哈希值作为盐吗?

    我在用着Rfc2898DeriveBytes从用户提供的字符串密码安全地生成加密密钥和初始化向量 以与对称加密 例如 AesManaged 一起使用 我将密码的 SHA1 哈希值作为盐参数Rfc2898DeriveBytes 这可以吗 如果