密码存储的正确姿势:从MD5到Argon2
David Ng | 2026-08-27T14:15:00 | Database, Security
为什么不能用MD5存密码?从彩虹表到Argon2,科普密码存储的演进历史和最佳实践
# 密码存储的正确姿势:从MD5到Argon2 新接手一个老项目,发现密码用MD5存储。赶紧提了升级方案,不然出了事整个团队都要背锅。 ## 为什么MD5不行 ```python import hashlib # MD5太快了,一秒能算几十亿次 password = "123456" md5_hash = hashlib.md5(password.encode()).hexdigest() # e10adc3949ba59abbe56e057f20f883e # 彩虹表里一查就出来了 ``` ## 加盐也不够安全 ```python import os # 加盐可以防彩虹表,但MD5太快了,暴力破解依然可行 salt = os.urandom(16) salted = hashlib.md5(salt + password.encode()).hexdigest() # GPU一秒跑几十亿次hash,8位密码几小时就破了 ``` ## 正确方案:Argon2 ```python # Argon2:2015年密码哈希竞赛冠军 from argon2 import PasswordHasher ph = PasswordHasher( time_cost=3, # 迭代次数 memory_cost=65536, # 内存消耗64MB parallelism=4 # 并行线程数 ) # 加密 hashed = ph.hash("my_password") # $argon2id$v=19$m=65536,t=3,p=4$...(每次结果不同) # 验证 try: ph.verify(hashed, "my_password") print("密码正确") except Exception: print("密码错误") ``` | 算法 | 速度 | 安全性 | 推荐 | |------|------|--------|------| | MD5 | 极快 | 不安全 | 禁止 | | SHA256 | 快 | 不推荐 | 不推荐 | | bcrypt | 慢 | 安全 | 可以 | | Argon2 | 可调 | 最安全 | 首选 | 2024年了,新项目直接上Argon2,老项目至少升级到bcrypt。