检查用户是否存在于数据库中,如果确实存在则检索该用户哈希值的盐密码和盐(这是在客户端或服务器端完成的吗?我认为客户端会更好,但php是服务器端所以如何你做这个?)
要记住的重要一点是,您永远不会相信用户,这意味着您需要在服务器端尽可能多地进行身份验证.尽可能少地向用户提供信息,不要相信任何信息.
关于你的问题,显而易见的一点是,如果让用户预先计算哈希值,则涉及的数据传输要多得多.而不是单个请求和响应,需要3个请求和响应.它还增加了从浏览器到启用JavaScript的浏览器的要求.根据您的受众,许多用户可以禁用JavaScript(通常通过NoScript插件).
关于安全性,同时允许用户查看salt不会影响对彩虹表的防御,向他们展示如何组合salt和密码.
无论如何,通过Web界面进行的暴力尝试都不是问题,因为希望您每个用户每小时只允许5次(或更多次)登录尝试.知道salt和散列算法根本没有帮助(它只会减少你的服务器负载;)).但是,如果他们拥有数据库并且知道如何将salt和hash结合起来,那么进行暴力攻击会变得容易得多.
虽然通过默默无闻的安全性并不是真正的防御,但它确实使您的系统更难破解,因此我建议您不要尝试在客户端进行散列.
检查用户是否存在于数据库中,如果确实存在,则检索该用户哈希的密码和盐
不.这意味着你要两次击中你的数据库.
哈希密码和盐(这将在客户端或服务器端完成吗?我认为客户端会更好
没有.密码哈希的重点在于,如果有人破坏了您的数据库,他们就不能(轻松)找出他们需要发送到您的系统(或其他系统)以便以该用户身份登录的内容.
如果在将密码发送到服务器之前对密码进行哈希处理,则攻击者可以绕过JS并将从数据库中读取的预先设置的密码发送到您的系统.