-1

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

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

我编写了一个小型 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)

目前,这似乎已经很好了,但我仍然对可能更安全的进一步策略/想法感兴趣。

4

2 回答 2

2

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

以下链接可以对此有所帮助:Properly convert secure string to string

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

如何使用安全字符串

如果您真的需要明文密码,我相信这是您可以做的最安全的事情。

但还要检查以下链接:

ProtectedData API, CryptprotectData

关于加密的 Codeproject 文章

于 2014-05-20T19:58:03.570 回答
0

直接从文档中来

PasswordBox.Password 属性

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

PasswordBox.SecurePassword 属性

于 2014-05-20T18:10:38.080 回答