面试中的一个基本问题:如何在数据库中存储密码?
面试中的一个基本问题:如何在数据库中存储密码?
在安全面试中,“如何在数据库中存储密码?”是一个基础问题,但反映了应聘者对安全最佳实践的理解。以下是安全存储密码的最佳实践概述。
了解风险
存储密码必须安全,因为数据库易遭网络攻击。目标是即使攻击者获得访问权限,也难以获取明文密码。
明文存储:大忌
绝不使用明文存储密码,因其缺乏任何保护措施。
哈希处理:第一道防线
哈希将密码转为固定大小的字符串,常用的哈希算法有:
- SHA-256:安全性和性能较平衡。
- SHA-3:最新的安全散列算法。
但单靠哈希不够安全,需要引入“加盐”和“加胡椒”。
加盐和加胡椒
- 加盐(Salting):每个用户的密码添加唯一随机盐,并与散列密码一起存储。
- 加胡椒(Peppering):随机值存储于安全的独立位置,不与数据库一起保存。
实施安全密码存储
- 为每个密码生成唯一盐,并附加后散列。
- 使用 bcrypt、scrypt 或 Argon2 等安全哈希算法。
- 将盐和哈希值分别存储。
现代哈希算法
- Bcrypt:自动添加盐并设计得运行较慢,增加暴力破解难度。
- Scrypt:增加内存需求,防硬件攻击。
- Argon2:PHC 竞赛获胜者,最安全。
Python 示例
import bcrypt
# Generate a salt
salt = bcrypt.gensalt()
# Hash the password with the salt
hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt)
# Store both salt and hashed_password in the database
验证密码
当用户尝试登录时,他们提供的密码将与存储的盐进行哈希处理,然后将得到的哈希与存储的哈希进行比较。如果匹配,则密码正确。
# Check if the provided password matches the stored hashed password
if bcrypt.checkpw(provided_password.encode('utf-8'), hashed_password):
print("Password match")
else:
print("Password does not match")
结论
安全地存储密码是应用程序安全性的一个基本方面。通过使用哈希、加盐和加胡椒等技术,以及利用 bcrypt、scrypt 和 Argon2 等强大的现代哈希算法,您可以显著增强存储密码的安全性。理解并实施这些最佳实践表明您对安全性的承诺以及您在保护敏感数据方面的熟练程度。