密码加密器
PasswordEncoder
概念- 用户请求认证
- 拿出数据库中存储着的用户注册密码
- 比较此次用户上传的密码
- 用户请求认证
- 密码储存和验证的历史环境
- 原始的简单存储
- 早期密码未经过加密直接储存在数据库,而访问数据库需要权限,所以有一定安全性
- 但是如果出现数据库攻击
- 如SQL Injection
- 可以直接拿到明文,密码会直接泄漏
- 如SQL Injection
- 但是如果出现数据库攻击
- 早期密码未经过加密直接储存在数据库,而访问数据库需要权限,所以有一定安全性
- 普通加密存储
- 将密码Hash
- 数据库仅保存Hash后的字符
- 用户输入密码
- Hash输入的密码
- 比较用户Hash和数据库
Hash- 如果遇到攻击
- 只泄露Hash
- 但是已经有技术(如Rainbow Tables)可以通过Lookup和表的相关技术破解
- 例如通过大量注册简单密码,拿到数据库对应密文,找到之间的关系。
- 但是已经有技术(如Rainbow Tables)可以通过Lookup和表的相关技术破解
- 只泄露Hash
- 如果遇到攻击
- 比较用户Hash和数据库
- Hash输入的密码
- 用户输入密码
- 数据库仅保存Hash后的字符
- 将密码Hash
- “咸密码”
- 用户保存密码
- 同时生成一串随机字节(盐)
- Hash(用户密码+盐)
- 数据库保存(用户密码+盐)的Hash值——SaltyHash
- 单独明文保存盐
- 用户请求认证,输入密码
- 数据库拿到用户密码
- Hash(新拿到的用户密码+盐)——newSaltyHash
- 比较两个加盐后生成的Hash值
- 此时Rainbow Table不起作用,因为每个简单密码加盐以后的Hash值都不一样
- 比较两个加盐后生成的Hash值
- Hash(新拿到的用户密码+盐)——newSaltyHash
- 数据库拿到用户密码
- 用户请求认证,输入密码
- Hash(用户密码+盐)
- 由于硬件进步,有些算法已经很好破解,如
- 原始的简单存储