V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
WildCat
V2EX  ›  问与答

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

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

    其实就是 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   ·   实用小工具   ·   1545 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:56 · PVG 00:56 · LAX 08:56 · JFK 11:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.