标签: securestring

在.NET中散列SecureString

在.NET中,我们有SecureString类,在你尝试使用它之前一切都很好,因为(例如)散列字符串,你需要明文.在编写一个将散列SecureString的函数时,我已经开始了,给定一个带有字节数组并输出字节数组的散列函数.

private static byte[] HashSecureString(SecureString ss, Func<byte[], byte[]> 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 to copy the string into
    byte[] bytes = new byte[length];

    // Copy the BSTR to the byte array
    Marshal.Copy(bstr, bytes, 0, length);

    // Immediately destroy …
Run Code Online (Sandbox Code Playgroud)

.net c# securestring password-encryption

24
推荐指数
2
解决办法
5334
查看次数

如何使用powershell的读取主机功能来接受外部服务的密码?

我有一个脚本,我写的是连接到SOAP服务.建立连接后,我需要使用我发送的每个命令传入用户名/传递.我遇到的问题是,当我使用read-host执行此操作时,我的密码以明文形式显示并保留在shell中:

PS C:\Users\Egr> Read-Host "Enter Pass"
Enter Pass: MyPassword
MyPassword
Run Code Online (Sandbox Code Playgroud)

如果我使用-AsSecureString隐藏它,则该值不能再传递给服务,因为它现在是System.Security.SecureString对象:

PS C:\Users\gross> Read-Host "Enter Pass" -AsSecureString
Enter Pass: **********
System.Security.SecureString
Run Code Online (Sandbox Code Playgroud)

当我通过它时,它不起作用.我不关心以明文形式传递给服务的密码,我只是不希望它们在输入密码后粘在用户的shell上.是否可以隐藏Read-Host输入,但仍然将密码存储为明文?如果没有,有没有办法可以将System.Security.SecureString对象作为明文传递?

谢谢

powershell user-input securestring powershell-2.0

23
推荐指数
2
解决办法
3万
查看次数

安全使用SecureString登录表单

所以这个类似乎很少使用:SecureString.它至少从2.0开始就存在,并且有一些SO问题,但我想我会问自己的具体问题:

我有一个LoginForm; 带有用户名和(掩码)密码字段的简单WinForms对话框.当用户同时输入并单击"登录"时,信息将传递到执行一层键扩展的注入认证类,然后散列一半拉伸键进行验证,而另一半是加密用户的对称密钥帐户数据.完成所有这些操作后,将关闭loginForm,处理身份验证器类,然后系统继续加载主窗体.非常标准的东西,可能比标准的哈希 - 密码和比较更多一些,但是在我的情况下,简单的哈希密码将通过以明文形式存储用户数据而被打败,因为该数据包括第三个的凭证 - 派对系统(我们都知道人们如何重用密码).

这是第一个问题; 我如何使用SecureString从密码文本框中检索密码,不是通过文本框的Text属性将其公开为普通的System.String?我假设有一种方法可以访问由CLR类包装的Textbox的非托管GDI窗口,并使用Marshal类提取文本数据.我只是不知道怎么样,而且我似乎无法找到好的信息.

这是第二个问题; 一旦我将密码作为SecureString,我如何从System.Security.Crypto命名空间将其传递给哈希提供程序?我的猜测是我使用Marshal.SecureStringToBSTR(),然后Marshal.Copy()从返回的IntPtr返回到一个字节数组.然后我可以调用Marshal.ZeroBSTR()来清理非托管内存,一旦我有哈希,我可以用Array.Clear()将托管数组清零.如果有一种更简洁的方法可以让我完全控制内存的任何托管副本的生命周期,请告诉我们.

第三个问题; 这一切真的是必要的,还是在托管内存环境中System.String固有的不安全性有点过分了?在操作系统考虑将应用程序交换到虚拟内存之前很久,任何用于存储密码(加密或其他方式)的内容都应该超出范围并且在前往垃圾收集器的路上(允许在交换文件后从交换文件中嗅探密码)硬关机的电脑).冷启动攻击是一种理论上的可能性,但实际上,这有多常见?更大的问题是现在解密的用户数据,它在整个应用程序生命周期中作为用户的一部分而挂起(因此将成为使用SecureStrings的主要候选者,因为除了几个基本用法之外,它们保持相当休眠状态).

c# security securestring

20
推荐指数
2
解决办法
1万
查看次数

从内存中清除C#字符串

我出于安全原因试图清除C#字符串的内存内容.我知道的SecureString类,但不幸的是我不能使用SecureString,而不是String在我的应用程序.需要清除的字符串是在运行时动态创建的(例如,我不是要清除字符串文字).

我发现的大多数搜索结果基本上都说清除a的内容String是不可能的(因为字符串是不可变的)并且SecureString应该使用.

因此,我确实在下面提出了我自己的解决方案(使用不安全的代码).测试显示解决方案有效,但我仍然不确定解决方案是否有任何问题?还有更好的吗?

static unsafe bool clearString(string s, bool clearInternedString=false) 
{
    if (clearInternedString || string.IsInterned(s) == null)
    {
        fixed (char* c = s)
        {
            for (int i = 0; i < s.Length; i++)
                c[i] = '\0';
        }
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

编辑:由于GC的注释在clearString被调用之前移动字符串:下面的代码片段怎么样?

string s = new string('\0', len);
fixed (char* c = s)
{
    // copy data from secure location to s
    c[0] = ...; …
Run Code Online (Sandbox Code Playgroud)

c# memory security string securestring

20
推荐指数
3
解决办法
7756
查看次数

Java相当于SecureString

我正在寻找Java相当于.NET的SecureString.aspx.是否有这样的实施在2018年?

OWASP实现并不完全相同,因为它只是一个普通的char数组.虽然.NET等价物提供了额外的功能,例如从/向非托管内存获取实例的能力以及加密.

我知道普通的Java模式传递密码,char[]Arrays.fill()在使用后用零做.但它需要在char[]所有时间内构建一个简单的实用程序类.

java securestring java-security

13
推荐指数
2
解决办法
3630
查看次数

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

我的应用程序使用RijndaelManaged类来加密数据.作为此加密的一部分,我使用加载了密码的SecureString对象,该密码可以转换为字节数组并在运行时加载到RajindaelManaged对象的Key中.

我的问题是存储此SecureString.用户输入的密码可以在运行时输入,并且可以"安全"加载到SecureString对象中,但如果没有给出用户输入的密码,那么我需要默认为某些东西.

所以问题最终归结为:

如果每次我的应用程序运行时都必须将一些已知的字符串或字节数组加载到SecureString对象中,我该怎么做?"加密"数据最终会被另一个应用程序解密,因此即使没有指定用户输入密码,我仍然需要在从一个应用程序转到另一个应用程序时对数据进行加密.这意味着我不能将默认密码设为随机,因为其他应用程序无法正确解密它.

我正在考虑的一个可能的解决方案是创建一个仅发出单个密码的dll,然后我使用该密码并在运行时通过几个不同的散列/重组函数运行它,然后我最终将其提供给secureString对象.这会足够安全吗?

编辑为清晰起见*:加密数据通过机器之间的文件传递.可以将其视为一个始终具有密码的Zip文件,如果用户没有直接输入任何密码,则假定为默认密码.

.net c# security store securestring

11
推荐指数
3
解决办法
9579
查看次数

SecureString用于存储在内存中并显示密码?或者是其他东西?

我一直在为自己编写一个小程序,使用C#,我可以用来存储我的密码,然后检索它们进行查看/编辑.

虽然密码以加密格式存储到磁盘,但当它们被读入内存以便在表单上显示/编辑时,它们是未加密的.

我了解到在内存中使用未加密的密码是一个非常大的安全问题,所以我遇到了这个问题SecureString.

有没有比使用SecureString该类更安全的方法,或者不SecureString辜负它的名字?

c# memory security securestring

10
推荐指数
2
解决办法
9457
查看次数

在C#中,处理敏感数据(如密码)的正确方法是什么?

此应用程序显示带有文本框的表单,用户应在其中输入用于解密文档的密码.

我的代码看起来像这样:

string password = passwordTextBox.Text;
...
DecryptDocument(password);
Run Code Online (Sandbox Code Playgroud)

但我被告知,从技术上讲,这是一个安全漏洞,因为即使应用程序关闭后,代表密码的数据也可能保留在内存中.

我试图使用System.Security.SecureString类,但现在我正在处理指向CoTaskMem的指针,这似乎使问题变得更糟:

SecureString password = new SecureString();
foreach(char i in passwordTextBox.Text.ToCharArray())
password.AppendChar(i);

IntPtr ptr = Marshal.SecureStringToCoTaskMemAnsi(password);
int length = password.Length;
byte[] bytes = new byte[length];

Marshal.Copy(ptr, bytes, 0, length);

DecryptDocument(Encoding.Default.GetString(bytes));

Marshal.FreeCoTaskMem(ptr);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它看起来并不像我使应用程序更安全,因为迟早我将不得不接受输入(passwordTextBox.Text)并将其转换为我可以传递给DecryptDocument()的字符串功能.

有没有办法解决这个问题,还是应该处理这个安全漏洞?

c# security passwords securestring

9
推荐指数
1
解决办法
2279
查看次数

将SecureString放入PasswordBox

我有一个现有的SecureString,我想放入PasswordBox 而不泄露.Password.可以这样做吗?例如:

tbPassword.SecurePassword = DecryptString(Properties.Settings.Default.proxyPassword);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,DecryptString生成SecureString.但是,SecurePassword是一个只读属性,因此我无法为其赋值.

c# security wpf securestring

9
推荐指数
1
解决办法
1520
查看次数

SecureString到Byte [] C#

我怎样才能获得byte[]相当于a SecureString(我从中得到的PasswordBox)?

我的目标是使用a将这些字节写入CryptoStream文件,并且Write该类的方法接受byte[]输入,因此我想将其转换SecureStringbyte[]所以我可以使用a CryptoStream.

编辑:我不想使用,string因为它打败了一个点SecureString

c# encryption wpf securestring

8
推荐指数
2
解决办法
6218
查看次数