WebApp密码管理 - 散列,腌制等
问题描述:
在Web应用程序中寻找最安全(但也是可行)的密码管理方式。WebApp密码管理 - 散列,腌制等
现在,我将密码保存为散列。应用程序的数据库帐户仅限于存储过程的执行,我通过将用户名和散列密码提供给返回1(true)或0(false)的存储过程来对用户进行身份验证。
因此,即使您拥有应用程序的数据库帐户,也无法从服务器获取密码。这就是我喜欢这个解决方案。但为了使用它,客户必须通过网络提交他的密码,或者至少可以捕获一个静态散列。
所以我就用握手这样的想法:
- 客户端请求服务器盐。
- 随机盐给客户端并存储在服务器上为这个单一客户端。
- 客户端发出哈希(盐+密码),然后返回这个哈希服务器
- 服务器使得哈希(盐+密码),并检查自己的相同,然后从客户端
使用此握手使得它可以检查密码不发送它或它的静态哈希。只是一个动态的哈希散列,每次用户登录时都是不同的=>高度安全。
但是,对于这种握手,我需要密码或至少从数据库散列的密码。但是,这使得某人至少可以获得哈希密码并将其暴露在应用程序之外。
你更喜欢什么?在DB内部保存密码并在那里做任何事情(安全服务器),或者从DB中取出密码并在外部进行(安全传输)?
由于提前, 商标
答
你提出的解决方案并不能真正解决问题。然而,服务器必须知道密码,所以它必须在某个时刻以简单的方式传送,这正是你想要首先避免的。这样您每次只能避免重新发送密码,但是如果有人在第一次转移密码时发现密码?
我认为你不应该重新发明轮子:-)对所有连接使用SSL,然后你的第一个解决方案正常工作。你甚至可以在客户端执行哈希,所以只有哈希通过安全通道发送。你的服务器永远不会知道密码,也不需要。
同意,SSL应该足够安全。当然也可以在数据库中散列密码,尽管现在MD5已经被怀疑了,所以我可以使用更安全的散列算法来做到这一点。您建议的握手过程与MS-CHAP类似,这也是可疑的。 – 2010-05-20 14:40:23
你是对的,但我认为这个密码被嗅探的可能性小于用户登录后的数百或数千次中的一次。我的连接是SSL nether更少,我只是想要一些额外的安全。现在我使用SHA1哈希构建的FormsAuthentications,但是我需要在另一个地方使用SHA-256,所以我想我会切换到这个。 你认为存储过程GetUser应该返回哈希密码?或者只是返回null而不是? – Marks 2010-05-20 16:22:32
当你谈论“安全”时,你总是假设一种最坏的情况。你认为攻击者总是存在并且利用你的系统中的每一个弱点,并且最大的有效性。从这个意义上说,他是否可以读取你的密码一次或一百次都没关系,事实上他可以读取它。您的客户不希望听到您说“攻击者读取密码的可能性不大”:-) 您的存储过程是否返回哈希或“null”取决于您,应该使用其他方式保护服务器无论如何阻止远程访问(防火墙,安全补丁,...) – 2010-05-21 11:13:52