C# - 比较两个 SecureString 是否相等

2023-12-30

我有一个带有两个密码框的 WPF 应用程序,一个用于密码,另一个用于第二次输入密码以进行确认。我本来想用PasswordBox.SecurePassword得到SecureString的密码,但我需要能够比较两个密码框的内容,以确保在接受密码之前相等。但是,两个相同的 SecureString 不被视为相等:

var secString1 = new SecureString();
var secString2 = new SecureString();
foreach (char c in "testing")
{
    secString1.AppendChar(c);
    secString2.AppendChar(c);
}
Assert.AreEqual(secString1, secString2); // This fails

我在想比较Password密码框的属性将破坏仅访问的点SecurePassword因为我会读取纯文本密码。我应该怎么做才能比较两个密码而不牺牲security https://stackoverflow.com/questions/141203/when-would-i-need-a-securestring-in-net?

Edit: 基于这个问题 https://stackoverflow.com/questions/978350, 我正在结账这篇博文 http://bartdesmet.net/blogs/bart/archive/2006/03/31/3851.aspx关于“使用 Marshal 类将 SecureString 转换为 ANSI 或 Unicode 或 BSTR”,那么也许我可以比较它们。


这没有不安全的块,并且不会以明文形式显示密码:

public static bool IsEqualTo(this SecureString ss1, SecureString ss2)
{
 IntPtr bstr1 = IntPtr.Zero;
 IntPtr bstr2 = IntPtr.Zero;
 try
 {
  bstr1 = Marshal.SecureStringToBSTR(ss1);
  bstr2 = Marshal.SecureStringToBSTR(ss2);
  int length1 = Marshal.ReadInt32(bstr1, -4);
  int length2 = Marshal.ReadInt32(bstr2, -4);
  if (length1 == length2)
  {
   for (int x = 0; x < length1; ++x)
   {
    byte b1 = Marshal.ReadByte(bstr1, x);
    byte b2 = Marshal.ReadByte(bstr2, x);
    if (b1 != b2) return false;
   }
  }
  else return false;
  return true;
 }
 finally
 {
  if (bstr2 != IntPtr.Zero) Marshal.ZeroFreeBSTR(bstr2);
  if (bstr1 != IntPtr.Zero) Marshal.ZeroFreeBSTR(bstr1);
 }
}

Edit:按照 Alex J. 的建议修复了泄漏。

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

C# - 比较两个 SecureString 是否相等 的相关文章

随机推荐

  • oplog.rs 文件中的“h”代表什么?

    就像这里一样 ts Timestamp 1374832131 1 h NumberLong 1336944105039123379 v 2 op i ns users users o id ObjectId 51f24603d98de371
  • Angular UI 引导对话框宽度

    Angular UI Bootstrap Dialog 很容易实现 但很难定制 你到底如何改变宽度 或者甚至是最大宽度 http angular ui github com bootstrap dialog http angular ui
  • 在 Powershell 2 中声明第三方程序集类型的通用列表

    我正在尝试创建一个新的Collections Generic List类型的对象Amazon Cloudwatch Model Dimensions在 Powershell 2 0 中 我可以创建一个Amazon Cloudwatch Mo
  • 我什么时候应该使用 C++ 固定宽度整数类型以及它们如何影响性能?

    通常我想大多数人会使用int对于一切 他们偶尔会使用unsigned int需要的时候 有时你可能会使用short int 也许是为了网络流量什么的 但最近我开始使用std size t用于索引到 STL 容器 正如我应该的那样 然后我开始
  • 载波不渲染,路径存在但图像不显示

    我一直在尝试从载波渲染图片 我相信它已正确上传 因为当我查看页面源代码时 我看到 img alt Photo 44 src uploads user image 59 Photo 44 jpg 但是通过单击该 src url 我得到 No
  • 是否可以从主机程序执行单个 lua 语句?

    我正在尝试将基于 lua 的脚本系统嵌入到我的游戏引擎中 我希望脚本能够同时具有阻塞和非阻塞命令 例如 character walkTo 24 359 Blocks until character arrives c 35 Non bloc
  • GCC:为什么无法在 -std=c11 -Wall 下编译干净的 printf("%f\n", f16) ?

    示例代码 include
  • Eclipse Android 应用程序:使用真实证书签名运行

    有没有一种方法可以让运行按钮使用真正的签名证书而不是调试证书 我想避免在安装开发副本之前从模拟器中卸载 共享用户 应用程序 我已经知道我可以导出签名副本 但我更喜欢自动构建签名副本 在模拟器上运行 我假设您正在使用 Eclipse 首先 通
  • 通过powershell获取IIS日志位置?

    我正在编写一个脚本 希望能够在 IIS 服务器之间轻松移动以分析日志 但这些服务器将日志存储在不同的位置 一些在 C 一些在 D 一些在 W3SVC1 中 一些在 W3SVC3 中 我希望能够让 powershell 自行查找此信息 而不必
  • 从整数序列生成表达式文字列表

    我想将整数序列映射到表达式文字序列 以便将后者用作图中的刻度线标签 例如 lbls lt lapply 2 2 function i expression i pi plot axis 1 at seq 2 2 pi labels lbls
  • Apache Spark 中的驱动程序何时不会运行某个操作?

    我刚刚开始使用 Spark 并且在任务的概念上遇到了困难 任何人都可以帮助我理解何时某个操作 例如减少 不在驱动程序中运行 从火花教程中 使用函数 func 聚合数据集的元素 其中 接受两个参数并返回一个 该函数应该是 具有交换性和结合性
  • 使用 SqlCe 和 EntityFramework 进行插入和更新的语法

    VS 2008 SqlCe 3 5 我正在尝试学习 EntityFramework 但无法让基本的插入和更新工作 当我包含 SqlCe 数据库 sdf 时 向导会创建 Test edmx designer vb 文件 由此我创建了我的数据上
  • jquery.tokeninput 必需

    我有这个很棒的小插件正在运行 但我需要要求至少选择一个名称 我通常使用jquery validate 但是 验证插件似乎不适用于使用 tokeninput 的字段 有人有答案吗 一如既往 非常感谢您的帮助 NewMessage valida
  • 处理 std::thread::hardware_concurrency()

    In my question https stackoverflow com questions 27887654 synchronise push back and stdthread about std thread 我被建议使用std
  • lucene 4.0 快照中缺少的功能

    我正在尝试使用 lucene 4 0 快照版本 但是此版本中缺少 StandardAnalyzer 有人知道如何替换它吗 在给出的示例代码中Lucene总结 http search lucene com jd lucene org apac
  • C# 低级鼠标钩子和表单事件处理

    我正在使用 VS 2010 生成的简单表单 其中包含 2 个按钮 开始和停止 Start 使用 SetWindowsHookEx 触发 WH MOUSE LL stop 停止钩子 挂钩工作正常 我设法用双击 替换 鼠标中键单击 我遇到的唯一
  • 反应悬念/懒惰延迟?

    我正在尝试使用新的 React Lazy 和 Suspense 来创建后备加载组件 这效果很好 但回退只显示几毫秒 有没有办法添加额外的延迟或最短时间 以便我可以在渲染下一个组件之前显示此组件的动画 现在懒惰导入 const Home la
  • Symfony 1.4:使用 SetAttribute 在会话中存储数组

    我想知道是否有人知道如何将数组存储到用户会话中 这是存储单个属性的方法 this gt getUser gt setAttribute something something 文档说 用户属性可以存储任何类型的数据 字符串 数组和关联数组
  • MVC 4 bool 的自定义模板(剃刀)

    我正在使用 twitter bootstrap 框架 因此为了让 EditorFor 和 DisplayFor 方法输出我需要的内容 我为字符串 文本 密码等每种类型创建了自定义模板 对于我的登录页面 我想要一个 RememberMe bo
  • C# - 比较两个 SecureString 是否相等

    我有一个带有两个密码框的 WPF 应用程序 一个用于密码 另一个用于第二次输入密码以进行确认 我本来想用PasswordBox SecurePassword得到SecureString的密码 但我需要能够比较两个密码框的内容 以确保在接受密