从 C# 中的 .NET SecureString 读取单个字符?

2024-05-22

WPF 的PasswordBox 返回一个SecureString,它对窥探者隐藏密码。

问题是你最终必须获得密码的值,而我在网上找到的建议都涉及将值复制到字符串中,这会让你回到窥探者的问题。

IntPtr bstr = Marshal.SecureStringToBSTR(secureString);
string password = Marshal.PtrToStringBSTR(bstr);
Marshal.FreeBSTR(bstr);

但如果您认真考虑一下,您实际上并不需要该值作为字符串。我的意思是,你用密码做什么?对它进行散列,然后将结果与保存的散列进行比较,看看它们是否相同。

换句话说,您不需要将 SecureString 转换为字符串,只需能够迭代字符串中的各个字符即可。

But how?

如何在 C# 中循环 BSTR 中的各个字符,而不将其转换为托管字符串?

编辑:解决方案,以防链接消失:

Marshall 类提供了可以从 IntPtr 中按给定偏移量提取单个字节或整数的方法。 BSTR 对象包含一个 16 位字符数组,以两个空字节终止。所以你可以通过循环访问它们:

byte b = 1;
int i = 0;
while ((char)b != '\0')
{
    b = Marshal.ReadByte(bstr, i);
    // ...
    i += 2;
}

(我不关心那个流程控制。我会使用 do...while,而不是用虚拟值预填充 b,或者我会使用 for(;;) 循环,并带有内部中断,或者我会循环长度,我在下面解释如何获得它。)

另外,我可能会使用:

short b = Marshal.ReadInt16(bstr, i);

读取整个 unicode 字符,而不是仅读取每个字符的低字节。

您可以通过以下方式获取 BSTR 的长度:

int len = Marshal.ReadInt32(bstr, -4);

这是字节数,不包括空值,而不是字符数。

另外 - 使用:

Marshal.ZeroFreeBSTR(bstr);

http://weblogs.asp.net/pglavich/archive/2005/08/15/422525.aspx http://weblogs.asp.net/pglavich/archive/2005/08/15/422525.aspx

此链接显示如何使用 Marshal.SecureStringToBSTR(secretString) 并将其分配给指针并更新指针以循环遍历字符。

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

从 C# 中的 .NET SecureString 读取单个字符? 的相关文章

随机推荐

  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • Django 'ImportError:无法导入名称 url'

    您好 有人可以帮我解决 ImportError 无法导入名称 url 问题吗 我在这里遵循了教程https docs djangoproject com en 1 9 intro tutorial01 https docs djangopr
  • Java 和 SQL Server 中的精度噩梦

    我一直在与 Java 和 SQL Server 中的精确噩梦作斗争 直到我不再知道了 就我个人而言 我理解这个问题及其根本原因 但向地球另一端的客户解释这一点是不可行的 至少对我来说 情况是这样的 我在 SQL Server 中有两列 Qt
  • 展平数组:保持索引、值等于数组中的位置

    我在尝试以特定方式展平数组时遇到了一些麻烦 这里有一个print r我想要展平的数组的视图 Array 1 gt Array 8 gt 1 9 gt 2 10 gt Array 15 gt Array 22 gt 1
  • 滚动视图上的固定按钮

    我目前正在尝试在屏幕右下角的滚动视图上显示一个按钮 但它不起作用 当我滚动视图时按钮会移动 我尝试先插入按钮 但滚动视图位于其上方 class HomePage extends Component loadUserItems this pr
  • Mysql 将 --secure-file-priv 选项设置为 NULL

    我在 Ubuntu 中运行 MySQL 我在运行特定的查询集时收到此错误 MySQL 服务器正在使用 secure file priv 选项运行 因此无法执行此语句 当我这样做的时候SELECT secure file priv 在我的 m
  • 在片段视图之间切换

    在 xml 布局文件中声明片段的标准方法是
  • pandas - 组合行的字符串

    我有一个像这样的数据框 id text 1 DM HTN Enlarged prostate 2 hypertensive and on regular treatment 2 LBP 3 DM HTN Enlarged prostate
  • 测量 WPF 中的文本

    使用WPF 测量大量短字符串最有效的方法是什么 具体来说 我想确定每个字符串的显示高度 给定统一格式 相同的字体 大小 粗细等 以及字符串可能占用的最大宽度 最低级的技术 因此为创意优化提供了最大的空间 是使用 GlyphRuns 它没有很
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • 更新 Elm 中的记录

    注意 这是我第一次看到 Elm 上周我偶然了解到它的存在 当您更新记录时 您是真正更新记录还是只是创建新记录 gt bill name Nye age 57 name Nye gt bill age 22 age 22 name Gates
  • Python 单元测试:Nose 失败时重试?

    我有一个随机失败的测试 我想让它在发送错误消息之前重试多次 我将 python 与 Nose 一起使用 我写了以下内容 但不幸的是 即使使用 try except 处理 当第一次尝试测试失败时 Nose 也会返回错误 def test so
  • 在 PHP 数组定义中显示重复键警告

    下面的代码是否可以得到警告 error reporting E ALL s array a gt 1 a gt 1 var export s 你唯一的希望 除了count 你自己 是你的编辑足够聪明 可以突出显示拼写错误 此屏幕截图来自 P
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • SwiftUI:如何让项目的拖放重新排序起作用?

    我有以下 SwiftUI 视图 struct ContentView View State var model Model var body some View ScrollView LazyVGrid columns columns sp
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • 如何找出javascript中加载了哪些javascript?

    继另一个问题的评论之后 我问自己是否有办法获取页面上加载的所有 js 代码的列表 就像 Firebug 或 chrome Inspector 所做的那样 有没有一种纯javascript的方法 一种方法是抓取脚本标签 但这样你可能会错过动态
  • jRails 是 Rails + jQuery 必须的吗?

    我是rails新手 使用rails 2 3 10 并且想使用jquery 特别是jquery ui 该项目是一个全新的项目 我计划使用 jquery ui 中的一些小部件 如 datapicker 和 selectable 等 我听说可以安
  • Flutter 中 Android RecyclerView.SCROLL STATE IDLE 的等价物是什么

    Android 给出的滚动状态如下RecyclerView SCROLL STATE IDLE它告诉用户何时停止滚动 我找不到任何选择在颤动中Pageview or ListView滚动监听器 我的问题 我需要检测 PageView 中的向
  • 从 C# 中的 .NET SecureString 读取单个字符?

    WPF 的PasswordBox 返回一个SecureString 它对窥探者隐藏密码 问题是你最终必须获得密码的值 而我在网上找到的建议都涉及将值复制到字符串中 这会让你回到窥探者的问题 IntPtr bstr Marshal Secur