本文以开发 iOS 端 App 为例, 谈谈自己对登录注册的主要流程的理解. 具体的实现细节逻辑, 需要两端对各种情况去做出对应的处理, 比如注册时检查账号是不是已经存在,诸如此类问题
一. 注册功能主要流程:
- 注册流程开始.
- 用户输入 账号 和 密码, 点击 <注册>
- App 发起申请 key 请求,
App 先对用户的账号进行 RSA 非对称加密, 然后把加密后的账号传递给 Server , - Server 返回 key,
Server 收到请求后, 生成 key 返回给 App, 并保存到数据库,用作以后的校验. - App 用 key 对用户密码加密,
App 收到 key 后, 结合 key 对用户的密码加密, 加密时进行两次 HASH 运算. 生成加密后的 HPassword, App 保存 key 到钥匙串中, 下次登录时加密使用, key 需要定期更换, 即定key过期后,让用户重新登录, 登录时先申请新的 key, 然后再登录. - 把 HPassword 用 RSA 加密传递给 Server. 不需要做时间戳校验,
- Server RSA 解密并保存 HMAC 密码.
Server 收到传过来的密码保存在对应的账号下, 返回注册成功, 用户接收到成功之后可以让用户重新输入账号密码登录, 可以接着悄悄你替用户登录. - 注册流程完成.
二. 账号登录功能主要流程:
- 用户输入账号 和 密码, 点击登录.
- App 如果从钥匙串中取出以前保存的 key, 把账号 和 key 都用 RAS 加密传递给 Server 请求登录时间戳, 这个时间戳必须以系统时间为准,精确到分钟即可, 如: 202004272347, 这样就可以保证 HPassword 时效性最多只有 1 分 59 秒, 防止模拟登录.
- Server 生成系统当前时间戳, 检验 key 是否过期, 如果过期再生成一个新的 key, 一起返回给 APP.
- App 收到时间戳和 key 后, 如果过期则更新钥匙串中保存的 key, 用 密码 和 key 生成 HPassword, 在 HPassword 后拼接上 时间戳, 再进行 md5 生成 mHPassword, 传递给 Server.
- Server 用注册时保存的 HPassword 拼接上系统当前时间戳(time_1)进行 md5 得到 mHPassword_2, 与 mHPassword 进行对比, 如果相等, 则登录成功, 如果不相等, 再用 HPassword 拼接 time_1 的前一分钟进行 md5 得到 mHPassword_3, 与 mHPassword 对比, 如果相等, 则登录成功, 如果还不相等, 则登录失败.
总而言之, 密码只能是用户知道, 因此只有重置, 没有找回.
用户隐私数据的原则:
- 1.网络上不允许明文传递;
- 2.本地(终端和服务器)不允许明文保存.
网友评论