C# 和 WPF - 使用 SecureString 作为客户端 HTTP API 密码
C# & WPF - Using SecureString for a client-side HTTP API password
编写 WPF 应用程序时,PasswordBox
将输入的密码存储为 SecureString
。这完全有道理。但是,我想通过 HTTP API 发送密码,HttpClient
PostAsync 似乎接受表单编码数据的字符串。
我知道其他人已经问过相关问题,最著名的是 Is SecureString ever practical in a C# application?,但我没有找到令人满意的方法将此 SecureString
发送到 Http 端点,而无需先将其转换为一个String
。转换首先完全破坏了 SecureString
的对象(因为它将明文直接放回托管内存)。
是否有规范正确的(最好是直接的)方法来做到这一点?
完整披露 - 我无法控制 HTTP API。
我认为,虽然不完美,但对您来说最好的解决方案是使用 DecryptSecureString
方法,posted by rdev5 on this answer(毕竟,密码是无论如何通过网络以明文传输)
rdev5 的方法将 SecureString
解密为一个字符串,按照您告诉它的方式处理密码,然后将其从内存中清除。这减少了密码在内存中的 window,从而减少了从那里偷看密码的时间。
Strings.DecryptSecureString(secureString, (password) =>
{
// Do your API call here
});
P.S.:正如原文post中指出的,只是确保不要将password
的内容保存到别处。
编写 WPF 应用程序时,PasswordBox
将输入的密码存储为 SecureString
。这完全有道理。但是,我想通过 HTTP API 发送密码,HttpClient
PostAsync 似乎接受表单编码数据的字符串。
我知道其他人已经问过相关问题,最著名的是 Is SecureString ever practical in a C# application?,但我没有找到令人满意的方法将此 SecureString
发送到 Http 端点,而无需先将其转换为一个String
。转换首先完全破坏了 SecureString
的对象(因为它将明文直接放回托管内存)。
是否有规范正确的(最好是直接的)方法来做到这一点?
完整披露 - 我无法控制 HTTP API。
我认为,虽然不完美,但对您来说最好的解决方案是使用 DecryptSecureString
方法,posted by rdev5 on this answer(毕竟,密码是无论如何通过网络以明文传输)
rdev5 的方法将 SecureString
解密为一个字符串,按照您告诉它的方式处理密码,然后将其从内存中清除。这减少了密码在内存中的 window,从而减少了从那里偷看密码的时间。
Strings.DecryptSecureString(secureString, (password) =>
{
// Do your API call here
});
P.S.:正如原文post中指出的,只是确保不要将password
的内容保存到别处。