服务器与客户端想明文通信,但是想在 HTTP header 里加个 token 字段,服务器验证请求是 client 发出而不是第三方伪造的,这个 token 应该用什么算法生成? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WildCat
V2EX    问与答

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

  •  
  •   WildCat 2016-02-19 16:45:02 +08:00 3266 次点击
    这是一个创建于 3602 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    谢谢!
    oott123
        8
    oott123  
       2016-02-20 20:49:06 +08:00   1
    @WildCat 传时间戳就好啦,这又不是什么敏感数据。
    大致的做法就是签名:
    例如你的 API 是 /search/?query=aabbcc
    然后你的盐是 WildCat112233
    当前时间戳是 22334455
    那么你可以把你的请求进行签名(摘要算法,而不是“不可逆加密”): sign=sha256("WildCat112233,/search/?query=aabbcc,22334455")
    最后得到的请求则是:
    /search/?query=aabbcc&timestamp=22334455&sign=deadcafexxx
    WildCat
        9
    WildCat  
    OP
       2016-02-20 21:02:10 +08:00 via iPhone
    @oott123 十分感谢!
    JiShuTui
        10
    JiShuTui  
       2016-02-20 21:12:11 +08:00   1
    而且传时间戳的好处是,你知道这个请求是什么时候发出的,跟服务器时间对比,比如说 5 分钟之内的请求你才去处理,超过 5 分钟的,直接当做错误请求。
    有一个危险是,有人喜欢把手机时间设置为提前 30 分钟,那么这个手机的所有请求都无法处理,解决办法是把 5 分钟改为 1 小时或者 2 小时,没有人会把手机设为提前 2 小时吧。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1010 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 18:45 PVG 02:45 LAX 10:45 JFK 13:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86