博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
本地存储密码的安全设计
阅读量:5052 次
发布时间:2019-06-12

本文共 1893 字,大约阅读时间需要 6 分钟。

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

1 安全要求

1.1 要实现的

1.防止攻击者得到用户密码的明文 防止攻击者拿到自动登录token后,一直都可以登陆 即使两个用户的密码相同,服务器保存的密文密码也不一样 可在服务器端清除salt,让用户的自动登录token失效,需手动登录 用户在多个终端登录同一个帐号,各终端的自动登录功能都生效

1.2 不实现的

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

2 APP场景分析

2.1 注册时A

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

1.注册时客户端在注册接口里提交EncryptedPassword 服务器用AesKey解出ClientSalt + HashedPassword,因为ClientSalt固定22字节,能计算得到HashedPassword

注册成功后,服务器保存的用户密码是SavedPassword。生成方法如下:

ServerSalt = 服务器随机生成8个字符(从0-9A-Za-z中选) SavedPassword = Base64(AesEncrypt(ServerSalt + HashedPassword, 服务器专用密钥))说明:

1.有了ServerSalt,即使两个用户的密码相同,最后的EncryptedPassword也会不一样。 用户密码在中没有明文存储。

2.2 手动登录时

说明:

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

 

2.3 自动登录时

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清零来实现

2.4 多终端自动登陆的时间

多终端在执行2.2手动登录过程时,会生成多份Salt/SaltExpire,一个终端自动登录后会产生新的Salt(老的那个Salt会清除掉),但不会影响另一个终端的自动登录,因为用的Salt本来就不同。

转自:http://www.2cto.com/Article/201505/401608.html

转载于:https://www.cnblogs.com/Alim/p/5242121.html

你可能感兴趣的文章
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
pig自定义UDF
查看>>
输入名字显示其生日,没有则让输入生日,做记录
查看>>
Kubernetes 运维学习笔记
查看>>
并查集 经典 畅通工程
查看>>
Spark MLlib 之 Naive Bayes
查看>>
php修改SESSION的有效生存时间
查看>>
spring security 11种过滤器介绍
查看>>
Hibernate一对多、多对一关联
查看>>
一、记录Git使用中遇到的问题及解决方法
查看>>
学习网址
查看>>
前端表格插件datatables
查看>>
内部类
查看>>
树链剖分入门
查看>>
图解算法时间复杂度
查看>>
UI_搭建MVC
查看>>
一个样例看清楚JQuery子元素选择器children()和find()的差别
查看>>
代码实现导航栏分割线
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>