Rfc2898DeriveBytes + PBKDF2 + SecureString 是否可以使用安全字符串代替字符串?

2024-05-31

我有一个功能GetPassword,返回一个SecureString type.

当我将此安全字符串传递给Rfc2898DeriveBytes生成密钥时,Visual Studio 显示错误。我有限的知识告诉我,这是因为Rfc2898DeriveBytes仅接受字符串而不接受安全字符串。有解决方法吗?

//read the password from terminal
Console.Write("Insert password");
securePwd = myCryptography.GetPassword();

//dont know why the salt is initialized like this
byte[] salt = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF1, 0xF0, 0xEE, 0x21, 0x22, 0x45 };
 try
 {   //PBKDF2 standard 
     Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(securePwd, salt, iterationsPwd);

我发现有趣的是Rfc2898DeriveBytes https://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes(v=vs.110).aspx类不支持SecureString https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx用于传递派生密钥时使用的密码的重载。

WPF 允许将密码处理为SecureString对象与PasswordBox https://msdn.microsoft.com/en-us/library/system.windows.controls.passwordbox(v=vs.110).aspx控制。由于我们无法传入一个值,因此该控件提供的附加安全性丢失了,这似乎是一种浪费。SecureString到构造函数。然而,erickson提出了使用的优点byte[]而不是string过载,因为正确管理 a 的内容相对容易byte[]记忆中比string.

Using 埃里克森的作为灵感我想出了以下包装器,它应该允许使用受保护的密码的值SecureString内存中明文值的暴露程度最小。

private byte[] DeriveKey(SecureString password, byte[] salt, int iterations, int keyByteLength)
{
    IntPtr ptr = Marshal.SecureStringToBSTR(password);
    byte[] passwordByteArray = null;
    try
    {
        int length = Marshal.ReadInt32(ptr, -4);
        passwordByteArray = new byte[length];
        GCHandle handle = GCHandle.Alloc(passwordByteArray, GCHandleType.Pinned);
        try
        {
            for (int i = 0; i < length; i++)
            {
                passwordByteArray[i] = Marshal.ReadByte(ptr, i);
            }

            using (var rfc2898 = new Rfc2898DeriveBytes(passwordByteArray, salt, iterations))
            {
                return rfc2898.GetBytes(keyByteLength);
            }
        }
        finally
        {
            Array.Clear(passwordByteArray, 0, passwordByteArray.Length);  
            handle.Free();
        }
    }
    finally
    {
        Marshal.ZeroFreeBSTR(ptr);
    }
}

这种方法利用了以下事实:BSTR https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069%28v=vs.85%29.aspx是一个指针,指向具有四字节长度前缀的数据字符串的第一个字符。

要点:

  • 通过包裹Rfc2898DeriveBytes在 using 语句中,它确保以确定性方式处理它。这很重要,因为它有一个内部HMACSHA1对象是一个KeyedHashAlgorithm并且需要在调用中将其拥有的密钥(密码)的副本清零Dispose. See 参考来源 https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rfc2898derivebytes.cs了解完整详情。
  • 一旦我们完成了BSTR我们将其归零并通过以下方式释放它零自由BSTR https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.zerofreebstr.aspx.
  • 最后,我们将密码副本归零(清除)。
  • Update:添加了固定byte[]。正如评论中所讨论的answer https://stackoverflow.com/a/1800733/1608786,如果byte[]如果没有固定,那么垃圾收集器可以在收集期间重新定位对象,并且我们将无法将原始副本清零。

这应该将明文密码在内存中保留最短的时间,并且不会削弱使用的收益SecureString太多了。不过,如果攻击者可以访问 RAM,您可能会遇到更大的问题。另一点是,我们只能管理我们自己的密码副本,我们使用的 API 很可能会错误地管理(而不是清零/清除)他们的副本。据我所知,情况并非如此Rfc2898DeriveBytes,虽然他们的副本byte[]密钥(密码)未固定,因此如果在清零之前将其移入堆中,则数组的痕迹可能会残留。这里的信息是,代码看起来很安全,但问题可能隐藏在下面。

如果有人发现此实施中有任何严重漏洞,请告诉我。

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

Rfc2898DeriveBytes + PBKDF2 + SecureString 是否可以使用安全字符串代替字符串? 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 登录后所有页面都应该是https吗?

    这有点难以解释 但我会尽力 有一个网站 每个页面上都有登录表单 其中包含用户名 密码字段 这些页面未使用 SSL 用户填写用户名 密码并提交表单后 表单将被发送到 https 的身份验证页面 对于这种情况我有几个疑问 向 https 页面提
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 在 HTTP PATCH 请求中包含数据的正确方法

    当我组合 HTTP PATCH 请求时 可以选择哪些选项来包含 URL 参数之外的数据 以下任何一项都有效吗 最常见的选择是什么 多部分 表单数据 应用程序 x www form urlencoded Raw JSON 还有其他的吗 HTT
  • OCaml - 什么数据类型是 some 和 none?

    如果我正在使用Some and None列表中的组合 列表的数据类型是什么 是不是总是 a 或者有某种类型Some None let listVar type here list Some 4 Some 3 None Some 2 如果我把
  • 如何在 Firebase Auth UI 注销后禁用密码自动登录请求的智能锁?

    我正在构建一个单一活动的 Android 应用程序 试图遵循 Google 的建议 我正在使用 FirebaseAuth UI 进行身份验证 它显然使用 密码智能锁 将凭据保存到您的谷歌帐户中 我的注销功能如下所示 private fun
  • 显示最后一条记录值,并非所有值都循环

    在下面的代码中 在 copyChild 和 insideModelRetrieved 函数中 在控制台 4 个功能上一一打印 但在下一个函数 onInnerModelRetrieved 4 次中打印最后一个功能值 我无法弄清楚为什么会发生这
  • tns run android --emulator 不工作 - NativeScript

    我已按照此步骤操作link http docs nativescript org tutorial chapter 1 当我使用命令运行时tns run android emulator 我在命令提示符中收到以下错误 Configuring
  • 如何使用NSDecimalNumber?

    我正在构建一个需要对金钱进行计算的应用程序 我想知道如何正确使用 NSDecimalNumber 特别是如何从整数 浮点数和双精度数初始化它 我只发现它很容易使用 decimalNumberWithString 方法 这 initWith
  • 将 Google CloudSQL Postgres 数据库连接到 Data Studio

    我正在尝试将托管在 google Cloud Sql 实例中的 Postgres 数据库连接到 Data Studio 我已按照说明进行操作 在此处找到https support google com datastudio answer 7
  • MongoDB 中两个集合之间的 Diff()

    我做过研究 如果这是一个重复的问题 我很抱歉 但其他问题的解决方案并不适合我 因此 我提出了一个新问题 使用 Javascript 比较两个集合的最佳方法是什么 我有数千个这样的 Mongo 文档格式的标头 url google com h
  • Seleneium 异常 - Arguments[0].click 不是 Selenium Python 中使用 execute_script() 的函数

    我正在这个网站上抓取交互式地图 https collegecrisis shinyapps io dashboard https collegecrisis shinyapps io dashboard 使用Python和Selenium
  • 将 (-inf...+inf) 范围内的任何值标准化为 (0...1)。是否可以?

    如果我们有具体的 max min 值范围 那么很容易将其标准化为 0 1 浮点值 但如果我们没有具体的限制呢 是否可以构建输出介于 0 和 1 之间的通用函数 在我看来 我认为这是不可能的 但我不是数学专家 我正在寻找 JavaScript
  • 写入 CSV 时,“\”、\x0A\x0D” 代码在 C# 中执行什么操作

    谁能告诉我在以下条件下检查什么 if s IndexOfAny x0A x0D ToCharArray gt 1 它正在检查是否有引号 Comma 换行 x0A或回车 x0D在字符串中s x0A是转义的十六进制换行符 相当于 n x0D是转
  • 如何上下移动字符串并从中删除相似的字符串?

    我问了一个可能不太清楚的问题 所以我尝试用一 种可以理解的方式来解释它 这是我的数据 我的数据看起来像这样 看起来像这样 V1 V2 V3 1 Q9UNZ5 Q9Y2W1 2 Q9ULV4 Q6QEF8 3 Q9UNZ5 4 Q9H6F5
  • C++ OpenCV imdecode 慢

    我将图像的字节数组从 C 发送到 C 库 我使用 OpenCV 版本 3 3 1 解码图像 BMP 图像解码速度很快 但 JPEG 图像解码速度很慢 如何加快 JPEG 图像的解码时间 多线程 GPU 解码性能 Resolution For
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • 根据所选选项更改表数据

    我有一个表显示数据库中的数据 我有一个选择框 人们可以在其中选择他想要显示数据的货币 当他这样做时 我需要刷新数据并显示为新货币 我不知道如何在不刷新整个页面的情况下做到这一点 有什么想法吗
  • 具有 ActiveMQ 代理网络的 JMS 消费者

    我在代理集群的 ActiveMQ 网络上有一个 JMS 主题 也称为分布式主题 我有一个外部 JMS 使用者 Weblogic 门户 需要订阅该主题并获取发送给它的所有消息 跨所有代理 如果消费者订阅其中一个代理上的主题 它只会获得代理收到
  • 如何使用 php 处理传出 webhook (Slack)

    我已经配置了 Slack outgoing webhook 但我不确定如何处理 Slack 发送到我指定的 URL 的 HTTP POST 请求 工作流程是这样的 当有人向指定通道发送消息时 API 将向指定 URL 之一发送 HTTP P
  • Bootstrap 4 Multi Carousel 显示 4 张图像而不是 3 张

    我不知道如何让它显示 4 张图像而不是 3 张 基于此代码 Bootstrap 4 多项目轮播 https www codeply com go FrzoIEKCdH bootstrap 4 carousel multiple 脚本JS r
  • Paper.js 与 excanvas

    我越来越喜欢 paper js 了 但在意识到它不支持 IE8 后 我想知道是否可以让 paper js 与 excanvas 一起工作 有人测试过这个吗 有可用的例子吗 谢谢 Paper js 代码显式使用 HTMLCanvasEleme
  • Rfc2898DeriveBytes + PBKDF2 + SecureString 是否可以使用安全字符串代替字符串?

    我有一个功能GetPassword 返回一个SecureString type 当我将此安全字符串传递给Rfc2898DeriveBytes生成密钥时 Visual Studio 显示错误 我有限的知识告诉我 这是因为Rfc2898Deri