如何在Silverlight中加密用户密码?

时间:2010-02-09 15:06:20

标签: security silverlight-3.0 passwords encryption-asymmetric

我有一个Silverlight 3应用程序,它连接到服务器以执行各种操作。我的用户使用表单身份验证登录,但他们请求的操作使用AppPool帐户在服务器上运行,因此当他们进入审计日志时,他们会根据AppPool帐户进行记录。 PCI DSS规则现在要求用户自己的ID在审计日志中,这意味着必须使用用户的信用来采取行动。现在,我可以在用户登录时保存用户的信用,并在每次请求时提交,并且服务器采取的操作可以使用这些信用。但PCI注册表示如果保存信用卡,则必须对其进行加密(以避免有人将PC内存转储并获取密码)。

我能看到这样做的唯一方法是从服务器获取公钥并使用它加密密码,然后提交加密密码并使用私钥在服务器上解密。但是Silverlight没有非对称加密技术。

我想我太接近问题而且必须有另一种解决方案,但我看不出它是什么。有人可以帮忙吗?

澄清

这是一个内部应用程序。到目前为止,我一直在使用IIS Forms AuthN over SSL到Active Directory - 我并不担心在传输中保护密码,只是在客户端内存中保存密码。据我了解,因为我正在使用表单身份验证,所以除非我使用LogonUser,否则我无法在服务器上进行模拟,这意味着我需要在服务器上输入密码,因此我需要每次都传输它,所以我需要保留它在客户端,在内存中,直到应用程序关闭。

2 个答案:

答案 0 :(得分:1)

您是说您需要存储密码以便在silverlight应用中重复使用?如果您担心内存中出现的密码未经加密,那么Silverlight则认为您遇到了麻烦。

.NET框架确实有一个SecureString类,用于您概述的确切目的。

不幸的是,框架的Silverlight版本没有这个类。因此,即使您在某个时刻保持密码的逻辑存储加密,您的代码也需要在 之前对其进行解密。此时,分配的内存包含未加密形式的字符串。

我对表单身份验证知之甚少,但是如果您可以将User原则映射到域用户(您似乎表明需要),那么您将需要在服务器上运行代码时使用模拟。

或者停止使用Forms身份验证并使用Windows集成身份验证,您绝对可以使用模拟服务器端。

答案 1 :(得分:0)

永远不应该使用加密密码。当你加密一些东西然后它应该有一种方法来解密它。应始终使用单向哈希密码。事实证明,md5和sha1对于任何安全的系统来说都太弱了。 应该使用Sha256,在silverlight中这个库将负责它: http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256%28VS.95%29.aspx

事实上,漏洞系列CWE-257会识别使用“加密”存储密码。使用消息摘要是安全存储密码的唯一方法。我不只是这样做,这是来自NIST。存储密码时会出现许多其他漏洞。以下是NIST汇总的THE LIST