【认证与授权】用户密码的安全传输与存储
🎫【认证与授权】用户密码的安全传输与存储
2023-4-14
| 2023-10-29
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Oct 29, 2023 02:51 AM
Parent item
领域
密码保存的安全性有两个大前提:
  1. 预计最坏的情况,攻击者已经知道除了用户原始密码的任何信息。包括全部程序、加密算法、数据库信息等等。
  1. 世上没有绝对的安全,但是假如当破解密码需要的成本超过获得的收益,就是相对安全的。

安全存储:使用耗时的加密 + Salt

💡
为每一个用户的密码进行加盐后再加密,在数据库中保存加密后的密码和盐。
这里可以是对称加密。也可以是简单的hash处理:H[S(a) + P(a)] -> P'(a),P(a)表示用户a的原始密码,S(a)表示用户a使用的盐,H表示加密或hash函数。
  • 因为每个密码加了盐,无法直接使用彩虹表破解
  • 因为每个用户的盐都不同,导致破解全部密码的成本非常高

密码保护算法

上述描述中的H可以使用下面的专用算法,提高安全性。
  • bcrypt密码哈希函数:可控耗时
  • scrypt

安全传输

一般都使用HTTPS来安全参数用户原始密码,但是如果特殊情况下,无法使用HTTPS,那么需要对原始密码进行加密后传输。
  1. 用户注册时,传输密码明文到后端,后端使用默认的aes加密密码并存储到数据库。如果是admin来生成密码, 那么用户无需传输密码,降低泄露风险
  1. 用户登录时,先从后台获取后台时间戳,在客户端组合时间戳和原始密码,并计算一个hash值,传输给后端
  1. 后端从数据库获取加密后的密码,并解密得到原始密码,然后使用相同的算法,组合原始密码和时间戳,计算hash,如果值一样,表示用户传输正确。
    1. 注意:这里后端使用的时间戳和前端的时间戳有可能存在1-2秒的差异,此时需要判断重试, 或者控制时间戳的精度
  1. 获得原始密码后,再组合各个用户的盐,验证密码是否正确
软件开发
  • 认证与授权
  • 网络安全
  • 【分布式】生成分布式事务ID【运维】DNS
    目录