我认为这应该是一个简短的问题,我希望这是一个问这个问题的好地方。
编辑:也许这将使讨论、建议和答案更有针对性:因为我有一个情况我别无选择,只能通过纯文本密码输入html web页面上的元素,最安全的方法是什么我可以处理,密码也给我使用wpf的密码框从用户检索它,我用.SecurePassword
检索密码的密码框,并使用以下函数详细安全字符串传递给输入元素,然后立即向服务器提交表单。我已经写了一个小的WPF应用程序,为我们的办公室自动化一个过程。作为该应用程序的一部分,用户ID和密码将传递给外部供应商。此应用程序在用户桌面上保持打开状态,因此此过程可以在一天中多次执行。
当我现在编写应用程序时,密码由用户输入到wpf密码框中一次,并且只有在供应商站点需要时才访问密码属性。在任何时候,我传递密码到另一个属性或文本字符串变量。
我的问题与这种方法的安全性有关。我不是IT安全专家,老实说,我们不希望因为它的内部实现而出现任何问题,但我确实想看看密码盒是如何存储密码的。
我的理解是,在这种情况下,密码以明文形式存在于内存中的唯一时间是它从我们的应用程序传递到外部供应商的应用程序的那一刻,这是或多或少不可避免的风险。外部供应商没有为我们提供API,所以我们能做的最好的是供应商网站input element.value = passwordbox.password
有人能强调一下这种方法的潜在风险吗?如果有的话,可能是另一种方法,或者如果有的话,可以说明它的安全性。
同样,这是一个由一个部门内部使用的小应用程序。我们预计不会出现问题,但我们预计会提出一些问题。我已经看了微软的文档,但是我想看看有没有更有经验的人有什么可以补充的。
提前感谢你的帮助!
编辑:仍然在工作,但我已经得到了一些很好的反馈,我已经考虑到。我从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)
目前,这似乎是最好的,但我仍然对可能更安全的进一步策略/想法感兴趣。
如果您确实必须以明文形式传递密码,请尽量短。
下面的链接可以帮助您:正确转换安全字符串为字符串
关于这个话题还有很多,对我最有帮助的链接是:
如何使用安全字符串
我相信这是最安全的,如果你真的需要一个明文密码。
但也检查以下链接:
ProtectedData API, CryptprotectData
关于加密的Codeproject文章
直接从文档
PasswordBox。密码属性
当获得Password属性值时,将密码公开为内存中的纯文本。为避免此潜在的安全风险,请使用SecurePassword属性以SecureString形式获取密码。
PasswordBox。SecurePassword地产