在WPF密码框控件中保留密码

时间:2014-05-20 16:20:41

标签: .net wpf security passwordbox

我认为这应该是一个快速的问题,我希望这是一个提出问题的好地方。

编辑:也许这会使讨论,建议和答案更加尖锐:鉴于我有一种情况,我没有选择,只能将纯文本密码传递给html网页上的输入元素,鉴于我正在使用wpf密码框从用户检索密码,我使用.SecurePassword从密码框中检索密码,并使用下面详述的功能,这是我可以处理该密码的最安全的方式将该安全字符串传递给input元素,然后立即将表单提交给服务器。

我编写了一个小型WPF应用程序,可以自动执行我们办公室的流程。作为该应用程序的一部分,用户ID和密码将传递给外部供应商。此应用程序在用户桌面上保持打开状态,因此可以在一天中多次执行此过程。

当我现在编写应用程序时,用户将密码输入到wpf密码框中一次,并且仅在供应商站点需要时才访问密码属性。在任何时候我都没有将密码传递给另一个属性或文本字符串变量。

我的问题与这种方法的安全性有关。我不是IT安全专家,我们并不诚实地期望由于其内部实现而对此有任何问题,但我确实希望看到密码框如何存储该密码。

我的理解是,在这种情况下,密码以纯文本形式存储在内存中的唯一时间是从我们的应用程序传递到外部供应商的应用程序,这是一种或多或少不可避免的风险。外部供应商未向我们提供API,因此我们所能做的最好的是供应商网站input element.value = passwordbox.password

有人可以强调这种方法的潜在风险,可能是一种替代方法(如果存在的话),或者如果存在那些安全性的论据。

同样,这是一个由一个部门内部使用的小应用程序。我们没有预料到问题,但我们期待提出一些问题。我已经查看了Microsoft文档,但我想看看是否有更多经验的人可能会添加一些内容。

提前感谢您的帮助!

编辑:仍在努力,但我得到了一些我已经考虑过的好反馈。我已经从Mare Infinitus发布的页面http://blogs.msdn.com/b/fpintos/archive/2009/06/12/how-to-properly-convert-securestring-to-string.aspx

中采用了这种方法

以下是我现在所拥有的:

用户在WPF密码框中输入密码。我有以下功能:

Private Function ConvertToUnsecureString(ByVal SecurePassword As SecureString) As String

    If SecurePassword Is Nothing Then Throw New ArgumentNullException("SecurePassword")

    Dim unmanagedString As IntPtr = IntPtr.Zero
    Try
        unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(SecurePassword)
        Return Marshal.PtrToStringUni(unmanagedString)
    Catch ex As Exception
    Finally
        Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString)
    End Try

End Function

使用该函数我将密码传递给输入元素,如下所示:

InputEl.value = ConvertToUnsecureString(Me.PasswordBox.SecurePassword)

目前,这似乎和它一样好,但我仍然对可能更安全的进一步战略/想法感兴趣。

2 个答案:

答案 0 :(得分:2)

如果您确实必须以明文形式传递密码,请尝试尽可能缩短密码。

以下链接可以为您提供帮助:Properly convert secure string to string

关于这个主题的确有更多内容,对我来说唯一最有用的链接是:

How to use secure string

我相信如果你真的需要一个明文密码,这是你可以做的最安全的。

但也请检查以下链接:

ProtectedData API, CryptprotectData

Codeproject article on encryption

答案 1 :(得分:0)

直接来自文档

PasswordBox.Password Property

  

获取密码属性值时,将密码公开为   内存中的纯文本。为避免这种潜在的安全风险,请使用   SecurePassword属性,用于将密码作为SecureString获取。

PasswordBox.SecurePassword Property