我正在 PHP/MySQL 中设计一个 API,根据其设计,它不会将用户的密码存储在数据库中,因此不会生成客户端持有的授权令牌。这样做的原因是为了防止在数据库受损的情况下获得任何敏感的、未加密的信息。
用户的敏感数据使用他们自己的密码进行加密,因此无法使用存储在(可能被泄露的)数据库中的任何内容来解密数据。我目前已经实现了一些安全功能:
- 如前所述,敏感数据使用 AES 加密,使用用户的 SHA-512 散列密码(密码作为表单数据随每个请求提供),加上一些额外的盐。
- HTTPS 是必需的,并且只允许 POST 请求。
- 用户帐户由电子邮件地址标识(在存储中经过修剪和小写),并且需要在使用前进行验证。
- 用户密码的长度必须至少为 8 个字符。
- 最终,第三方应用程序需要通过 Authorization 标头使用 API 令牌。第三方应用程序受到限制,因为它们无法创建、验证或删除帐户。
我的问题是,这就够了吗?我几乎不是安全专家,我最不想做的就是设计一些有重大监督的东西。我主要关心的是每个请求都会提供用户密码,即使它只能通过 SSL。
编辑:
澄清一下,用户将能够更改他们的密码,前提是他们仍然拥有当前密码。发出一个包含用户电子邮件地址、当前密码和新密码的请求。使用电子邮件地址和当前密码,像通常一样对请求进行身份验证。在继续之前,还要对新密码进行验证(强制最少 8 个字符)。
首先,正如用户希望检索他们的敏感信息时所做的那样,使用他们当前的密码对信息进行解密。在其解密状态下,然后使用新密码对信息进行加密,并在数据库中覆盖敏感数据。
此时,之前的密码没有存储记录,无法再使用。管理员无法更改密码,或者在任何情况下,如果没有先前用于加密信息的密码,则无法更改密码。如果密码丢失,则无能为力。