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

.net 在WPF密码框控件中保留密码,.net,wpf,security,passwordbox,.net,Wpf,Security,Passwordbox,我认为这应该是一个快速的问题,我希望这是一个好地方问它 编辑:也许这会使讨论、建议和答案更有针对性:考虑到我的处境,我别无选择,只能在html网页上向输入元素传递纯文本密码,处理该密码的最安全方式是什么?如果我使用wpf密码框从用户检索密码,我使用.SecurePassword从密码框检索密码,并使用下面详述的函数将该安全字符串传递给输入元素,然后立即将表单提交给服务器 我已经编写了一个小型WPF应用程序,它可以自动化我们办公室的流程。作为该应用程序的一部分,将用户ID和密码传递给外部供应商。此

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

编辑:也许这会使讨论、建议和答案更有针对性:考虑到我的处境,我别无选择,只能在html网页上向输入元素传递纯文本密码,处理该密码的最安全方式是什么?如果我使用wpf密码框从用户检索密码,我使用.SecurePassword从密码框检索密码,并使用下面详述的函数将该安全字符串传递给输入元素,然后立即将表单提交给服务器

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

正如我现在编写的应用程序一样,用户只需在wpf密码框中输入一次密码,并且只有在供应商站点需要时才能访问password属性。在任何情况下,我都不会将密码传递给另一个属性或文本字符串变量

我的问题与这种方法的安全性有关。我不是一名IT安全专家,老实说,由于IT的内部实现,我们不希望出现任何问题,但我确实想看看密码框如何存储该密码

据我所知,在这种情况下,密码以明文形式存在于内存中的唯一时间是从我们的应用程序传递到外部供应商的应用程序的那一刻,这是一种或多或少不可避免的风险。外部供应商没有向我们提供API,因此我们只能使用供应商站点输入元素。value=passwordbox.password

有人能强调这种方法的潜在风险吗?如果存在,可能是一种替代方法,如果存在,可能是安全性的论点

同样,这是一个由一个部门内部使用的小应用程序。我们并没有预料到这些问题,但我们期待着回答一些关于它的问题。我已经阅读了微软的文档,但我想看看是否有经验丰富的人可以补充一些东西

提前感谢您的帮助

编辑:仍在努力,但我得到了一些很好的反馈,我已经考虑到了。我采用了Mare Infinitus发布的页面中的方法

以下是我现在拥有的:

用户在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)

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

直接从文档中开始

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


如果你真的要以明文的形式传递密码,那么尽量简短地透露密码

以下链接对此有帮助:

关于这个话题还有很多,对我来说最有用的链接是:

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

还可以查看以下链接:


如果你关心安全,当你需要密码时,你会询问密码。处理这些密码时,您将使用一个新的方法和最佳做法。如果你不这样做,那么你真的不关心安全,你应该停止担心它或假装它是安全的。哦,大多数安全问题都是组织内部的。该应用程序是否在您的DMZ内运行?@这会不会。。。这就是我使用密码框的原因。我当然可以清除密码并在每次需要时提示输入,但根据我的理解,这在功能上与我已经使用的方法没有多大区别。如果你认为这种方法可以改进的话,我很想听听具体的反对意见和建议。@GayotFow我相信它会在非军事区运行。所涉及的用户凭据用于使用外部供应商使用SSL创建的应用程序访问网站,并且仅对该网站有效,但我不能保证用户不会重复使用用户ID和密码组合,该组合也用于我们内部网上更敏感的系统。这一部分不在我的掌握之中,我只想在不创建新的安全漏洞时尽我的一份力。如果你想存储密码,事情会变得非常复杂。我现在正在这样做,但要将密码输入到供应商应用程序中,我仍然必须以明文形式传递它,因此,它使用本页所述的方法进行转换:似乎
与给定的情况类似,这是最好的解决方案,但可能出现的例外情况是,每次执行应用程序设计的任务时都会提示输入密码。我可能会这样做,但我只是没有看到任何解释,为什么把它留在密码框里是不好的。真的这就是你现在正在做的吗?因此,我们最好能做的就是供应商站点输入元素。value=passwordbox.password我不把它理解为SecurePassword。对不起,我的意思是现在,就像现在一样,我已经考虑了Mare Infinitus上面的建议。我现在拥有的是一个sub,它在传递安全字符串时将其转换为纯文本。我会更新上面的问题,因为我不认为这是一个正确的答案,可以提供更多关于我现在采取的方法的信息。所以你是按照我的建议做的,但你是根据一天后其他人发布的帖子来做的?这是对Mare Infinitus发布的原始问题的评论:也许下面的链接对您有帮助:blogs.msdn.com/b/fpintos/archive/2009/06/12/…–2天前的Mare Infinitus当然,将SecureString转换为字符串会破坏SecureString的用途。@Ryanemele您还有其他建议吗?我将密码传递给供应商的唯一选择是使用纯文本字符串,但是在将密码传递给HTML元素时,您会建议我如何最小化或消除暴露风险?在我看来,SecureString的用途并没有完全被破坏。当然,在某些情况下,您需要纯文本。你只需要确保它在尽可能短的时间内显示出来。对于API需要以太明文密码的登录,我必须这样做一次,如何在客户端处理tbat?一旦SecureString转换为字符串,新字符串将存储在堆中,直到GC收集为止。因此,如果您的目标是防止从内存或内存转储中恢复字符串,那么您就无法达到使用SecureString的目的。@MattB-您所做的事情本质上是不安全的。如果您担心安全性,那么请找到一种与第三方集成的不同方式。使用安全的身份验证协议,或者接受这样一个事实,即如果某人已经足够确定,他们可以恢复密码。如果您不小心,即使您实现了一个安全的解决方案,它也可能不像您所想的那样安全,您所拥有的只是一种错误的安全感。