这可能听起来像是一个可怕的想法乍一看,但这里是我的情况:我有一个Windows服务,使用用户名认证公开几个WCF端点。自定义身份验证器将在本地数据库中查找用户的凭据(密码存储为盐渍SHA-1),或者它将向另一个服务发出WCF请求以验证密码。 (在User对象上有一个枚举,可以是Internal或External,指示使用哪个验证源)。缓存WCF服务内存中的明文密码
我发现执行查找+哈希检查或使WCF调用对我的服务的每个请求都很昂贵,所以我想缓存用户名/密码信息。缓存中的每个项目都有一个生命周期,例如,如果缓存中的项目的时间为60秒,则在下一次请求时,身份验证器将根据原始源代替缓存验证凭据,然后进行更新。
对于本地数据库,我可以简单地将用户名/ SHA1对存储在字典中,并且在来自“内部”用户的每个请求中,我只需重新提供散列提供的密码并进行比较。对于“外部”用户,我只会将明文密码提交给验证器,所以我将它放在哈希中并将其存储为缓存的一部分。尽管这肯定节省了数据库请求或远程服务调用的开销,但我仍然必须每次都执行哈希操作。
有问题的服务将运行在具有良好物理和网络安全性的内部服务器上。将明文密码存储在缓存中而不是存储散列版本是否可接受?在这种情况下,我的风险似乎是攻击者倾倒进程内存并获取密码。如果我认为风险可以接受,是否还有其他原因,我应该避免在内存中使用明文密码?
如果我选择使用明文密码,我认为SecureString可以在一定程度上限制我的风险。使用SecureString(实现它看起来非常迂回)是否值得遇到麻烦?我很清楚持久存储密码的风险,但我不确定共识似乎是什么在易变的明文密码存储上。
非常好的一点。经过一番讨论后,我们意识到WCF自定义用户名认证是以明文方式交付密码的,所以在任何时候,内存中都有纯文本密码(在认证和这些变量被GC分配之间)。所以拥有它们的缓存(尤其是过期的缓存)并不会增加我们的风险。感谢这些优点,我在讨论中提出了这些观点,并帮助我们得出结论:在我们的环境中这是可以接受的。 – 2010-03-30 20:16:03