服务端数据库有 LoginSalt 和 PasswordSalt 两个字段,前者是变化的,后者是固定的。 首先服务端存放的密码是 MD5(p + PasswordSalt) (p 为明文密码), PasswordSalt 是针对每个用户单独生成的,用来防彩虹表。
1.注册的时候
客户端生成 PasswordSalt 然后把 MD5(p + PasswordSalt) (这里用 PasswordSalt 是为了防止截取注册密码用彩虹表反推)和 PasswordSalt 传递给服务端,如果注册成功,服务端保存这两者
2.登录的时候
首先向服务端请求 LoginSalt ( LoginSalt 在请求时生成,并存入对应的用户中)和 PasswordSalt ,然后向服务端发送 MD5(MD5(p + PasswordSalt) + LoginSalt),然后服务端进行验证,如果验证通过,即登录成功,将重新生成 LoginSalt 并存入对应用户(防止重放攻击),这时候同时向客户端返回这个 LoginSalt ,以作为权限高一级 API 的 Token 。
这样是否可行?主要想达到的目的有三个, 1 是防彩虹表, 2 是防止重放攻击, 3 是给高权限 API 一个凭证 仔细想了下,或许还得有个 Token 字段,登录成功后返回随机生成的 Token 来代替 LoginSalt 比较好,直接用 LoginSalt ,别人用你的账号请求一次,你的 LoginSalt 就变了,请求高权限 API 就无效了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.