我认为这应该是一个快速的问题,我希望这是一个提问的好地方。
编辑:也许这会使讨论、建议和答案更加尖锐:鉴于我有一种情况,我别无选择,只能将纯文本密码传递给 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)
目前,这似乎已经很好了,但我仍然对可能更安全的进一步策略/想法感兴趣。