上一篇
html数据库密码加密
- 行业动态
- 2025-05-02
- 4714
HTML前端采集密码后,需通过HTTPS传输至后端,采用SHA-256等哈希算法加盐加密,存储数据库时仅保留哈希值,配合参数化查询防
前端密码处理
在HTML表单中,用户输入的密码通过<input type="password">
字段收集。切勿在前端直接存储明文密码,需通过HTTPS协议将数据安全传输至后端。
密码加密核心原理
方式 | 作用 | 典型算法 | 可逆性 |
---|---|---|---|
哈希(Hash) | 生成固定长度的散列值 | SHA-256、bcrypt | 不可逆 |
加盐(Salt) | 防止彩虹表攻击 | 随机字符串拼接 | 与哈希结合使用 |
加密(Encrypt) | 保护传输中的数据 | AES、RSA | 可逆(需密钥) |
关键流程:
- 后端获取明文密码
- 生成随机盐值(如
salt = base64(os.urandom(16))
) - 合并盐与密码(如
salt+password
) - 执行哈希运算(如
hash = SHA256(salt+password)
) - 存储
hash
和salt
到数据库
数据库存储规范
字段 | 用途 | 示例值 |
---|---|---|
password_hash | 存储哈希值 | $2b$12$... (bcrypt格式) |
salt | 存储盐值 | abc123... |
algorithm | 标识哈希算法 | bcrypt |
安全实践:
- 使用参数化查询防止SQL注入
- 定期升级哈希算法(如从SHA-1迁移到bcrypt)
- 单独存储盐值,避免重复利用
后端处理示例(伪代码)
# 接收前端密码 raw_password = request.form["password"] # 生成随机盐(16字节) salt = base64.b64encode(os.urandom(16)).decode() # 计算哈希(以bcrypt为例) hashed = bcrypt.hashpw(f"{salt}{raw_password}".encode(), bcrypt.gensalt()) # 存储到数据库 db.execute("INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?)", (username, hashed, salt))
前端安全增强
- 强制HTTPS:防止中间人窃取传输中的密码
- 禁用自动填充记忆:避免浏览器存储敏感信息
<input type="password" autocomplete="new-password">
- 防范XSS攻击:对用户输入进行转义处理
相关问题与解答
Q1:为什么不用MD5或SHA-1存储密码?
A1:这些算法计算速度过快,易被彩虹表破解,现代标准推荐使用bcrypt、Argon2等慢哈希算法,通过增加计算成本降低暴力破解效率。
Q2:如何实现密码重置功能?
A2:
- 生成带时效的Token(如
token = jwt.encode({"exp": datetime+1h}, secret)
) - 通过安全渠道(如邮件)发送Token
- 后端验证Token有效性后允许重置
- 注意:Token需与用户绑定,避免