php中的密码/登录系统

Jon*_*an. 3 php security hash login

对于php中的登录系统,这将是一个合适的大纲如何工作:

用户输入用户名和密码,点击登录按钮.

  1. 检查数据库中是否存在用户,
  2. 如果是,则检索该用户的salt
  3. 哈希密码和盐(这会在客户端或服务器端完成吗?我认为客户端会更好,但php是服务器端所以你会怎么做?)
  4. 根据数据库中的值检查值,
  5. 如果值匹配,则用户输入正确的密码并登录.

Yac*_*oby 6

检查用户是否存在于数据库中,如果确实存在则检索该用户哈希值的盐密码和盐(这是在客户端或服务器端完成的吗?我认为客户端会更好,但php是服务器端所以如何你做这个?)

要记住的重要一点是,您永远不会相信用户,这意味着您需要在服务器端尽可能多地进行身份验证.尽可能少地向用户提供信息,不要相信任何信息.

关于你的问题,显而易见的一点是,如果让用户预先计算哈希值,则涉及的数据传输要多得多.而不是单个请求和响应,需要3个请求和响应.它还增加了从浏览器到启用JavaScript的浏览器的要求.根据您的受众,许多用户可以禁用JavaScript(通常通过NoScript插件).

关于安全性,同时允许用户查看salt不会影响对彩虹表的防御,向他们展示如何组合salt和密码.

无论如何,通过Web界面进行的暴力尝试都不问题,因为希望您每个用户每小时只允许5次(或更多次)登录尝试.知道salt和散列算法根本没有帮助(它只会减少你的服务器负载;)).但是,如果他们拥有数据库并且知道如何将salt和hash结合起来,那么进行暴力攻击会变得容易得多.

虽然通过默默无闻的安全性并不是真正的防御,但它确实使您的系统更难破解,因此我建议您不要尝试在客户端进行散列.


Que*_*tin 5

检查用户是否存在于数据库中,如果确实存在,则检索该用户哈希的密码和盐

不.这意味着你要两次击中你的数据库.

哈希密码和盐(这将在客户端或服务器端完成吗?我认为客户端会更好

没有.密码哈希的重点在于,如果有人破坏了您的数据库,他们就不能(轻松)找出他们需要发送到您的系统(或其他系统)以便以该用户身份登录的内容.

如果在将密码发送到服务器之前对密码进行哈希处理,则攻击者可以绕过JS并将从数据库中读取的预先设置的密码发送到您的系统.

  1. 用户提交用户名和密码
  2. 密码使用系统的标准盐进行哈希处理
  3. SELECT some,cols FROM your_users WHERE username =?和密码=?
  4. 计算从数据库返回的行数.

  • 不,这些盐用于限制攻击者对散列密码使用彩虹表的能力.因此,每个应用程序的一个salt将比每个用户的一个salt和hash一样差.或者,为了更加彻底,应用程序的一个盐和每个用户一个盐.因此,如果攻击者仅攻击您的数据库,他将首先获得需要第一次彩虹攻击的应用程序哈希(因为他知道自己帐户的密码,他知道除了应用程序盐之外的所有内容). (3认同)