我正在寻找一种在Web应用程序中实现最安全(但可行的)密码管理方式。
目前,我将密码保存为哈希值。应用程序的DB账户仅限于执行存储过程,并通过向存储过程提供用户名和哈希密码来验证用户,该存储过程返回1(真)或0(假)。
因此,即使您拥有应用程序的DB账户,也无法从服务器获取密码。这就是我喜欢这个解决方案的原因。但是,要使用此解决方案,客户端必须通过Web提交其密码,或者至少提交可以被捕获的静态哈希。
所以我想到了使用以下握手方式:
- 客户端请求服务器的salt。 - 随机salt分配给客户端并存储在服务器上,供单个客户端使用。 - 客户端进行Hash(salt + password),并将此哈希返回给服务器。 - 服务器进行Hash(salt + password),并检查是否与客户端相同。
使用这个握手方式可以在不发送密码本身或其静态哈希的情况下检查密码。只需动态盐值哈希,每次用户登录时都不同=>高度安全。
但是,对于这个握手,我需要从DB获取密码或至少是哈希密码。但这会使某人至少获得哈希密码并在应用程序之外进行暴力破解。
您会选择什么?将密码保留在DB中并在其中进行任何操作(安全服务器),还是将其从DB中取出并在外部进行操作(安全传输)?
提前感谢, 马克斯
目前,我将密码保存为哈希值。应用程序的DB账户仅限于执行存储过程,并通过向存储过程提供用户名和哈希密码来验证用户,该存储过程返回1(真)或0(假)。
因此,即使您拥有应用程序的DB账户,也无法从服务器获取密码。这就是我喜欢这个解决方案的原因。但是,要使用此解决方案,客户端必须通过Web提交其密码,或者至少提交可以被捕获的静态哈希。
所以我想到了使用以下握手方式:
- 客户端请求服务器的salt。 - 随机salt分配给客户端并存储在服务器上,供单个客户端使用。 - 客户端进行Hash(salt + password),并将此哈希返回给服务器。 - 服务器进行Hash(salt + password),并检查是否与客户端相同。
使用这个握手方式可以在不发送密码本身或其静态哈希的情况下检查密码。只需动态盐值哈希,每次用户登录时都不同=>高度安全。
但是,对于这个握手,我需要从DB获取密码或至少是哈希密码。但这会使某人至少获得哈希密码并在应用程序之外进行暴力破解。
您会选择什么?将密码保留在DB中并在其中进行任何操作(安全服务器),还是将其从DB中取出并在外部进行操作(安全传输)?
提前感谢, 马克斯
null
,都取决于您,服务器应该采用其他手段进行保护,以防止远程访问(如防火墙、安全补丁等)。 - David Sauter