本地存储密码的安全设计

有些应用需要把用户密码保存在本地,本方案设计了一种较为安全的密码本地存储的方案。

[size=large][b]1 安全要求[/b][/size]
[size=medium]1.1 要实现的[/size]
[list=1]
[*]防止攻击者得到用户密码的明文
[*]防止攻击者拿到自动登录token后,一直都可以登陆
[*]即使两个用户的密码相同,服务器保存的密文密码也不一样
[*]可在服务器端清除salt,让用户的自动登录token失效,需手动登录
[*]用户在多个终端登录同一个帐号,各终端的自动登录功能都生效
[/list]

[size=medium][b]1.2 不实现的[/b][/size]
[list=1]
[*]更安全的方案能做到“把本地保存的文件复制到其他客户端”登录就会失效,这依赖于客户端做处理,本方案不实现
[*]有的方案采用RSA非对称加密,本方案直接采用AES对称加密
[/list]

[size=large][b]2 APP场景分析[/b][/size]
[size=medium][b]2.1 注册时[/b][/size]

AesKey = 前后端约定好的密钥
ClientSalt = 客户端随机生成8个字符(从0-9A-Za-z中选)
HashedPassword = SHA1(明文密码)
EncryptedPassword = Base64(AesEncrypt(ClientSalt + HashedPassword, AesKey))


[b]说明:[/b]
[list=1]
[*]注册时客户端在注册接口里提交EncryptedPassword
[*]服务器用AesKey解出ClientSalt + HashedPassword,因为ClientSalt固定22字节,能计算得到HashedPassword
[/list]

注册成功后,服务器保存的用户密码是SavedPassword。生成方法如下:
[code]
ServerSalt = 服务器随机生成8个字符(从0-9A-Za-z中选)
SavedPassword = Base64(AesEncrypt(ServerSalt + HashedPassword, 服务器专用密钥))
[/code]

[b]说明:[/b]
[list=1]
[*]有了ServerSalt,即使两个用户的密码相同,最后的EncryptedPassword也会不一样。
[*]用户密码在数据库中没有明文存储。
[/list]

[size=medium][b]2.2 手动登录时[/b][/size]
[b]说明:[/b]
1、客户端在手动登录接口里提交EncryptedPassword(生成方法同2.1注册时)
2、服务器验证的过程:
1) 用AesKey从客户端的EncryptedPassword里解出HashedPassword
2) 用服务器专用密钥从数据库的SavedPassword里解出HashedPassword
3) 比较两个HashedPassword
4) 验证成功后返给客户端SaltExpire和AutoLoginToken,生成方式如下:

Salt = 随机8字符(从0-9A-Za-z中选)
SaltExpire = 该Salt最后有效时间
AutoLoginToken = Base64(AesEncrypt(Salt + HashedPassword, 服务器专用密钥))

5) 把用户ID、Salt和SaltExpire保存在Salt缓存表中
3、客户端本地存储的是SaltExpire和AutoLoginToken,没有保存明文密码
4、客户端因为不知道服务器的Aes密钥,无法解出HashedPassword

[size=medium][b]2.3 自动登录时[/b][/size]
1、客户端先根据本地保存的SaltExpire来判断是否已过期,过期需要手动登录
2、未过期时,客户端在自动登录接口里提交AutoLoginToken
3、服务器验证的过程:
1) 从AutoLoginToken解出Salt和HashedPassword
2) 在Salt缓存表里查询该用户ID的此Salt是否已过期
3) 未过期的情况下对比两个HashedPassword
4) 验证成功时,构造新的Salt、SaltExpire及AutoLoginToken,把SaltExpire和AutoLoginToken返回给客户端
5) 把用户ID、新的Salt和SaltExpire保存在redis中,老的Salt清除掉
4、客户端更新本地存储的SaltExpire和AutoLoginToken
5、在出现风险需要用户手动登录时,可以把用户的SaltExpire清零来实现

[size=medium][b]2.4 多终端自动登陆的时间[/b][/size]
多终端在执行2.2手动登录过程时,会生成多份Salt/SaltExpire,一个终端自动登录后会产生新的Salt(老的那个Salt会清除掉),但不会影响另一个终端的自动登录,因为用的Salt本来就不同。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值