为什么我需要使用 Rfc2898DeriveBytes 类(在 .NET 中)而不是直接使用密码作为密钥或 IV?

2024-02-21

使用 Rfc2898DeriveBytes 和仅使用有什么区别Encoding.ASCII.GetBytes(string object);?

我对这两种方法都取得了相对成功,前者是一种较为冗长的方法,而后者则简单明了。两者似乎都允许你最终做同样的事情,但我很难看出使用前者而不是后者的意义。

我能够掌握的基本概念是,您可以将字符串密码转换为 用于例如对称加密类的字节数组,AesManaged。通过 RFC 类,但您可以在创建 rfc 对象时使用盐值和密码。我认为它更安全,但这充其量仍然是一个未经教育的猜测!此外,它还允许您返回特定大小的字节数组,以及类似的东西。

以下是一些例子,向您展示我来自哪里:

byte[] myPassinBytes = Encoding.ASCII.GetBytes("some password");

or

string password = "P@%5w0r]>";
byte[] saltArray = Encoding.ASCII.GetBytes("this is my salt");
Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(password, saltArray);

“rfcKey”对象现在可用于设置 .Key 或 .IV 属性 关于对称加密算法类。

ie.

RijndaelManaged rj = new RijndaelManaged ();
rj.Key = rfcKey.Getbytes(rj.KeySize / 8); 
rj.IV = rfcKey.Getbytes(rj.Blocksize / 8);

“rj”应该准备好了!

令人困惑的部分......所以我不可以只使用我的“rfcKey”对象 'myPassInBytes' 数组来帮助设置我的 'rj' 对象?

我尝试在 VS2008 中这样做,直接的答案是否定的。但是,对于为什么使用 RFC 类而不是我上面提到的其他替代方案,你们有更好的答案吗?


你真的真的不想直接使用用户密码作为加密密钥,尤其与 AES。

Rfc2898DeriveBytes 是 PBKDF2 的实现。它的作用是重复对用户密码和盐进行哈希处理。这有多个好处:

首先,您可以使用任意大小的密码 - AES 仅支持特定的密钥大小。

其次,添加盐意味着您可以使用相同的密码生成多个不同的密钥(假设盐不是常数,如您的示例中所示)。这对于密钥分离很重要;在不同的环境中重复使用密钥是破坏密码系统的最常见方式之一。

多次迭代(默认为 1000 次)可以减缓密码猜测攻击。考虑有人试图猜测您的 AES 密钥。如果您只使用密码,这将很简单 - 只需尝试每个可能的密码作为密钥。另一方面,对于 PBKDF2,攻击者首先必须执行 1000 次哈希迭代each密码猜测。因此,虽然它只会稍微减慢用户的速度,但对攻击者来说却会产生不成比例的影响。 (事实上​​,使用更高的迭代次数是很常见的;通常建议使用 10000)。

这也意味着最终输出密钥是均匀分布的。例如,如果您使用密码,则密钥的 128 位中通常有 16 位为 0(高 ASCII 位)。即使忽略密码猜测,这一点立即使密钥搜索比应有的容易 65536 倍。

最后,AES 存在与相关密钥攻击相关的特定漏洞。当攻击者知道用多个密钥加密的某些数据,并且它们之间存在某种已知(或猜测)的关系时,相关密钥攻击就可能发生。例如,如果您同时使用密码密钥“My AES key bads”(16 字节,对于 AES-128)和“MY AES KEY SUCKS”来加密数据,则可能会发生相关的密钥攻击。目前最著名的攻击实际上并不允许以这种方式破坏完整的 AES,但随着时间的推移,它们已经变得越来越好 - 就在上周,发布了一种新的攻击,该攻击使用以下方法破坏了 13 轮(总共 14 轮) AES-256相关的按键攻击。依赖这种攻击不会随着时间的推移而变得更好是非常不明智的。

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

为什么我需要使用 Rfc2898DeriveBytes 类(在 .NET 中)而不是直接使用密码作为密钥或 IV? 的相关文章

随机推荐

  • 从 SQL Server 中的表中选择 XML

    我的表中存储有 XML 该表具有 int 类型的列 id 和 XML 类型的值 我正在使用 SQL Server 2012 XML 看起来像这样
  • IPython %timeit 魔法的 -n 和 -r 参数

    我想使用以下方法对代码块进行计时timeitJupyter 笔记本中的魔法命令 根据文档 timeit需要几个参数 其中两个特别控制循环次数和重复次数 我不清楚这两个论点之间的区别 例如 import numpy N 1000000 v n
  • 如何检查列表中的任何单词是否包含部分字符串?

    var list alist Contains somestring 这匹配整个字符串 如何查看列表中的任何单词是否具有匹配 somestring 的子字符串 您可以使用可枚举 任意 http msdn microsoft com en u
  • gitosis 在哪里存储工作副本?

    我想知道 gitosis 在哪里存储我的存储库的工作副本 我可以通过 gitweb 界面看到文件树 但在 srv gitosis repositories testrepo 中找不到任何工作副本 我还能够推送和克隆到存储库 但是 在不知道工
  • 是否可以在 Delphi 可执行应用程序中嵌入并运行 exe 文件?

    资源文件 RES 接受任何类型的二进制文件 但如果它是 exe 文件 我该如何运行它 您必须将其作为文件提取到磁盘并执行它 尽管您不必将其提取到磁盘 正如 Cosmin Prund 在评论中所说 但如果您不这样做 则需要大量的艰苦工作
  • 如何构造一个不区分大小写的枚举?

    我有一个简单的 Python 2 7 枚举 from enum import Enum class Label enum RedApple 1 GreenApple 2 我希望能够使用不区分大小写的键创建枚举对象 fruitname red
  • 如何将命令行参数转换为 int?

    我需要获取一个参数并将其转换为 int 到目前为止 这是我的代码 include
  • R:从字符串定义函数

    我想定义一个函数f来自参数和表达式character从 a 读取的字符串 csv文件 这个功能f有以下表达式 f function parameters expression 其中参数是 n 个参数的列表 表达式是这些参数的函数 例如 参数
  • argv[0] 可以包含空字符串吗?

    在任何 C 程序中 命令行参数argv 0 指向用于调用程序的名称 有没有什么情况会指向空字符串 这种情况的示例代码片段将是一个很好的参考 它是实现定义的 5 1 2 2 1 删节 如果值argc大于零 数组成员argv 0 通过argv
  • 用于构建小型公司演示网站的简单 CMS

    我正在寻找一个免费 简单且高效的 CMS 来为一家小公司构建网站 先决条件是 该网站只不过是一个演示文稿 包含信息丰富的内容和画廊 该网站应该包含一个具有 js ajax 风格的漂亮画廊 目前没有更多计划 但如果 CMS 能够提供一些更通用
  • 防止在 DateTime 值反序列化时进行时区转换

    我有一个使用序列化 反序列化的类XmlSerializer 这个类包含一个DateTime field 当序列化时 DateTime字段由包含 GMT 偏移量的字符串表示 例如2010 05 05T09 13 45 05 00 反序列化时
  • OWIN OAuthAuthorizationServerProvider 中的 context.Request.User 为 null

    我正在尝试使用 OWIN 为本地 Intranet 上的 Web API v2 端点实现 OAuth 该 API 使用内置 Windows 身份验证托管在 IIS 中 简而言之 这就是我想要发生的事情 当我在 token 索要我的令牌时 将
  • Ruby 中类名前有双冒号?

    我在 Rails 中看到很多在类名之前使用双冒号的情况 例如 require File expand path config environment FILE 我知道什么Module Class Constant意思是 但是 Class 这
  • 使用 Jquery 获取当前 URL

    我对 javascript 和 jquery 很陌生 getJSON idcheck php callback url i want full url to be print function json alert json message
  • 我收到警告:控制到达非 void 函数的末尾

    我的程序似乎在 Visual Studio 中运行良好 但是当我在 GCC 中运行它时 它给了我一个编译错误 称为 Book cpp In member function sdds Book sdds Book addChapter con
  • WAS 7 的异常 java.util.zip.ZipFile.ensureOpenOrZipException

    当我部署应用程序时WebSphere Application Server 7 0 我遇到了异常 并且部署花费了太多时间 经过几次部署后 服务器开始生成堆转储并耗尽内存 在我们的应用程序中我们使用JAX WS用于生成 Web 服务客户端 我
  • 顺序评估依赖属性绑定?

    什么决定了同一控件上的多个 DepdencyProperties 的求值顺序 我正在使用扩展 WPF 工具包 http wpftoolkit codeplex com PropertyGrid 并绑定了 SelectedObject 和 P
  • Keras One Hot 编码内存管理 - 最好的出路

    我知道这个问题已经以不同的方式得到了解答past https stackoverflow com questions 41058780 python one hot encoding for huge data 但我无法弄清楚并适合我的代码
  • 没有 XML 绑定的 XSD 到 Delphi 类

    也许以前有人问过这个问题 但我还没有找到关于 Delphi 的问题 我在 Visual Studio 中使用了 XSD exe 它正是这样做的 将 XSD 转换为 纯香草 表示 XSD 中指定的实体的类 不绑定到 XML 文档 用于在 XS
  • 为什么我需要使用 Rfc2898DeriveBytes 类(在 .NET 中)而不是直接使用密码作为密钥或 IV?

    使用 Rfc2898DeriveBytes 和仅使用有什么区别Encoding ASCII GetBytes string object 我对这两种方法都取得了相对成功 前者是一种较为冗长的方法 而后者则简单明了 两者似乎都允许你最终做同样