Tag: securestring

安全地将加密的标准字符串转换为securestring

我有一个加密的标准字符串,在powershell中通过“convertfrom-securestring”创建并保存到文件中。 后来,我用C#app读取了这个加密的字符串(在相同的用户ID和同一台机器上)。 我想将此加密字符串转换为securestring对象。 在powershell中,可以使用“convertto-securestring”来完成此操作。 如何在c#中安全地做到这一点? 我知道这个答案( 我如何使用ConvertTo-SecureString ), 但它假设已使用已知密钥创建加密字符串 。 这与加密字符串是在没有密钥的情况下创建的情况不同(因此与绑定到用户ID和构造它的机器相关联。) 另请注意,在上述问题的注释中,引用了Microsoft的文档,表明在未提供密钥的情况下使用Windows数据保护API(DPAPI)。 本文( https://msdn.microsoft.com/en-us/library/ms229741(v=vs.110).aspx )展示了如何使用DPAPI,但遗憾的是,它以Microsoft文章中指定的方式使用它结果再次导致字符串在字符串对象中以明文forms出现(我们无法控制,相对于处理),因此以指示的方式使用它将是不安全的。 实际上,这实际上是这个( 如何解密通过PowerShell加密的C#中的字符串 )和我如何使用ConvertTo-SecureString中的问题的组合 。 为了记录,这段代码有效,但我不确定将解密后的字符串存储在字节数组中会出现什么问题,即使我尽快破解它: public static unsafe SecureString MakeSecurityString(string pwd) { int lngth = pwd.Length / 2; byte[] encrypted = new byte[lngth]; for (int i = 0; i < lngth; ++i) { encrypted[i] = byte.Parse(pwd.Substring(2 * i, 2), NumberStyles.HexNumber, […]

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

WPF的PasswordBox返回一个SecureString,它隐藏了snoopers的密码。 问题是你最终必须得到密码的值,而我在网上找到的建议都涉及将值复制到字符串中,这会让你回到窥探者的问题。 IntPtr bstr = Marshal.SecureStringToBSTR(secureString); string password = Marshal.PtrToStringBSTR(bstr); Marshal.FreeBSTR(bstr); 但是如果你真的想到它,你就不需要这个值作为一个字符串。 我的意思是,你用密码做什么? 您将其哈希,然后将结果与保存的哈希值进行比较,看看它们是否相同。 换句话说,您不需要将SecureString转换为字符串,您只需要能够遍历字符串中的各个字符。 但是怎么样? 如何在CTR中循环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的长度: […]

如何解密通过PowerShell加密的C#中的字符串

是否有可能解密通过PowerShell加密的C#中的字符串以及如何? 该字符串通过PowerShell加密,如下所示: $pw = read-host “Enter Password” –AsSecureString ConvertFrom-SecureString $pw | out-file “C:\file.txt” 要使用PowerShell将其转换回来,我可以使用这些调用C#类System.Runtime.InteropServices.Marshal命令。 $pwdSec = Get-Content “C:\file.txt” | ConvertTo-SecureString $bPswd = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwdSec) $pswd = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bPswd) File包含已转换为加密标准string(“hello”) 。 因此,如果打开file.txt文件,它看起来类似于: 01000000d08c9ddf0115d1118c7a00c04fc297eb0100000052ded6c2db80e748933432e19b9de8b10000 000002000000000003660000c00000001000000016dc35885d76d07bab289eb9927cfc1e000000000480 0000a0000000100000003106cde553f45b08d13d89d11336170b280000005cc865c1ee1b57e84ed3d1a2 d3f2d0ec0f189b532e61c18d1f31444d6f119a1e8368477fd2d81f54140000000cb0262e58b08ae14f37 22c14c69684841b6b21c

C#:向用户询问密码,然后将其存储在SecureString中

在我正在为客户开发的小应用程序中,我需要向用户询问他的Windows登录用户名,密码和域,然后使用System.Diagnostics.Process.Start启动应用程序。 我有一个带有UseSystemPasswordChar的文本框来屏蔽输入的密码。 我需要一个System.Security.SecureString来将密码提供给System.Diagnostics.Process.Start 。 如何将输入的文本转换为安全字符串,而不是一个又一个字符? 或者:是否有更好的窗口控件要求用户输入密码,将输入的文本作为SecureString返回?

如何从进程内存中删除字符串?

我有一个应用程序从Windows窗体文本框中获取一个字符串,并将其传递给使用字符串作为参数的API。 我看到任务完成后仍然可以从进程内存查询字符串。 我遇到过使用SecureString进行字符串内存管理function的建议。 但是,如果我理解正确,如果安全字符串是从字符串构建的,或者安全字符串的值最终存储在字符串中,则字符串的用途就会失败。 请建议什么是最好的解决方案。

在程序代码中安全地存储密码?

我的应用程序使用RijndaelManaged类来加密数据。 作为此加密的一部分,我使用加载了密码的SecureString对象,将其转换为字节数组并在运行时加载到RajindaelManaged对象的Key中。 我的问题是存储此SecureString。 用户输入的密码可以在运行时输入,并且可以“安全”加载到SecureString对象中,但如果没有给出用户输入的密码,那么我需要默认为某些东西。 所以问题最终归结为: 如果每次我的应用程序运行时都必须有一些已知的字符串或字节数组加载到SecureString对象中,我该怎么做? “加密”数据最终会被另一个应用程序解密,所以即使没有指定用户输入密码,我仍然需要在从一个应用程序转到另一个应用程序时对数据进行加密。 这意味着我不能将默认密码设为随机,因为其他应用程序无法正确解密它。 我正在考虑的一个可能的解决方案是创建一个仅发出单个密码的dll,然后我使用该密码并在运行时通过几个不同的散列/重组函数运行它,然后我最终将其提供给secureString对象。 这会足够安全吗? 编辑为清晰起见*:加密数据通过机器之间的文件传递。 将其视为始终具有密码的Zip文件,如果用户没有直接输入任何密码,则假定为默认密码。

安全使用SecureString登录表单

所以这个类似乎很少使用: SecureString 。 它至少从2.0开始就存在,并且有一些SO问题,但我想我会问自己的具体问题: 我有一个LoginForm; 带有用户名和(掩码)密码字段的简单WinForms对话框。 当用户同时输入并单击“登录”时,信息将传递到执行一层键扩展的注入认证类,然后散列一半拉伸键进行validation,而另一半是加密用户的对称密钥帐户数据。 完成所有这些操作后,将关闭loginForm,处理身份validation器类,然后系统继续加载主窗体。 非常标准的东西,可能比标准的哈希 – 密码和比较更多一些,但在我的情况下,简单的哈希密码将通过以明文forms存储用户数据而被打败,因为该数据包括第三个的凭证 – 派对系统(我们都知道人们如何重用密码)。 这是第一个问题; 我如何使用SecureString从密码文本框中检索密码, 而不通过文本框的Text属性将其公开为普通的System.String? 我假设有一种方法可以访问由CLR类包装的Textbox的非托管GDI窗口,并使用Marshal类提取文本数据。 我只是不知道怎么样,而且我似乎无法找到好的信息。 这是第二个问题; 一旦我将密码作为SecureString,我如何从System.Security.Crypto命名空间将其传递给哈希提供程序? 我的猜测是我使用Marshal.SecureStringToBSTR(),然后Marshal.Copy()从返回的IntPtr返回到一个字节数组。 然后我可以调用Marshal.ZeroBSTR()来清理非托管内存,一旦我有哈希,我可以用Array.Clear()将托管数组清零。 如果有一种更简洁的方法可以让我完全控制内存的任何托管副本的生命周期,请告诉我们。 第三个问题; 这一切真的是必要的,还是在管理内存环境中System.String固有的不安全性有点过分了? 用于存储密码(加密或其他方式)的任何内容都应该超出范围并且在操作系统考虑将应用程序交换到虚拟内存之前很久就会进入垃圾收集器(允许在交换文件之后从交换文件中嗅探密码)硬关机的电脑)。 冷启动攻击是一种理论上的可能性,但实际上,这有多常见? 更大的问题是现在解密的用户数据,它在整个应用程序生命周期中作为用户的一部分而挂起(因此将成为使用SecureStrings的主要候选者,因为除了几个基本用法之外,它们保持相当hibernate状态)。

SecureString到Byte C#

我如何得到一个相当于SecureString的byte[] (我从PasswordBox获得)? 我的目标是使用CryptoStream将这些字节写入文件,并且该类的Write方法接受byte[]输入,因此我想将SecureString转换为byte[]以便我可以使用CryptoStream 。 编辑:我不想使用string因为它击败了拥有SecureString的点

在.NET中散列SecureString

在.NET中,我们有SecureString类,在你尝试使用它之前一切都很好,因为(例如)散列字符串,你需要明文。 我已经开始编写一个函数来散列SecureString,给定一个带字节数组并输出字节数组的散列函数。 private static byte[] HashSecureString(SecureString ss, Func hash) { // Convert the SecureString to a BSTR IntPtr bstr = Marshal.SecureStringToBSTR(ss); // BSTR contains the length of the string in bytes in an // Int32 stored in the 4 bytes prior to the BSTR pointer int length = Marshal.ReadInt32(bstr, -4); // Allocate a byte array […]

C#SecureString问题

有没有办法在不包含安全性的情况下获得SecureString的价值? 例如,在下面的代码中,只要执行PtrToStringBSTR,字符串就不再安全,因为字符串是不可变的,垃圾收集对于字符串是不确定的。 IntPtr ptr = Marshal.SecureStringToBSTR(SecureString object); string value = Marshal.PtrToStringBSTR(ptr); 如果有办法获取非托管BSTR字符串的char []或byte []怎么办? 这是否意味着垃圾收集更可预测(因为你将使用char []或byte []而不是字符串?这个假设是正确的,如果是这样,你将如何得到char []或byte []?