服务器与客户端想明文通信,但是想在 HTTP header 里加个 token 字段,服务器验证请求是 client 发出而不是第三方伪造的,这个 token 应该用什么算法生成?

2016-02-19 16:45:02 +08:00
 WildCat

其实就是 V2EX 客户端,由于客户端要求各位用账号密码登录,为了避嫌,不想和 app 服务器进行完全加密的通信。
最近想做全文搜索(因为有人因为 app 不能搜索在 App Store 给我差评 =。=),但是全文搜索对服务器消耗很大,所以想限制仅仅只能从自己写的 iOS App 发出这个请求,想在请求的 HTTP header 里加个 token ,这个 token 如何生成?服务端如何校验?

我对这个 token 的需求:
- 最好是不可逆向的加密(避嫌),比如对时间(精确到分钟之类的)和 salt 进行 sha1 ,服务器也进行计算,比较结果
- token 最好短一些,省的被怀疑里面包含用户名密码

当然,其他方案也可以。
感谢。

2817 次点击
所在节点    问与答
10 条回复
XiaoxiaoPu
2016-02-19 17:12:26 +08:00
kungs
2016-02-19 17:14:01 +08:00
jwt
JiShuTui
2016-02-19 17:16:33 +08:00
http://mp.weixin.qq.com/wiki/4/2ccadaef44fe1e4b0322355c2312bfa8.html
参考微信公众号接口的消息验证算法
oott123
2016-02-19 18:35:54 +08:00
不可逆向的是哈希吧。
我觉得简单的带个时间戳和固定盐做个哈希就好了。
stackpop
2016-02-19 18:41:07 +08:00
rsa 签名
mozutaba
2016-02-20 13:56:11 +08:00
json web token
WildCat
2016-02-20 20:44:26 +08:00
@oott123
@JiShuTui

时间戳加盐然后不可逆加密,这样时间戳也得加个单独字段放在请求里,这样服务端才能做验算吧?如果时间戳不传,会不会有很大误差?

谢谢!
oott123
2016-02-20 20:49:06 +08:00
@WildCat 传时间戳就好啦,这又不是什么敏感数据。
大致的做法就是签名:
例如你的 API 是 /search/?query=aabbcc
然后你的盐是 WildCat112233
当前时间戳是 22334455
那么你可以把你的请求进行签名(摘要算法,而不是“不可逆加密”): sign=sha256("WildCat112233,/search/?query=aabbcc,22334455")
最后得到的请求则是:
/search/?query=aabbcc&timestamp=22334455&sign=deadcafexxx
WildCat
2016-02-20 21:02:10 +08:00
@oott123 十分感谢!
JiShuTui
2016-02-20 21:12:11 +08:00
而且传时间戳的好处是,你知道这个请求是什么时候发出的,跟服务器时间对比,比如说 5 分钟之内的请求你才去处理,超过 5 分钟的,直接当做错误请求。
有一个危险是,有人喜欢把手机时间设置为提前 30 分钟,那么这个手机的所有请求都无法处理,解决办法是把 5 分钟改为 1 小时或者 2 小时,没有人会把手机设为提前 2 小时吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/257682

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX