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

开发一个网站 api 接口要加验证,请帮忙看下我的方法是否安全

  •  
  •   gdtv · 2015-01-30 20:52:37 +08:00 · 8201 次点击
    这是一个创建于 3376 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1、约定一个安全码$security_key = 'xxxxxxxxxxxxxxxx'
    2、假设要向接口发送的参数是:a=123,b=234,那么:
    $sign = md5('a=123&b=234'.$security_key)
    http://api_adress/?a=123&b=234&sign=$sign
    3、接口接收到以上参数后,反向验证一下

    请问这样足够安全吗?
    17 条回复    2015-05-13 21:32:42 +08:00
    NewYear
        1
    NewYear  
       2015-01-30 20:56:57 +08:00   ❤️ 3
    不够 还要加上当前时间 以及一个随机字符

    当前时间确保在一定时间内,比如在60秒内这个请求才有效,否则无限期的尝试……
    随机字符串来确保请求在60秒内只处理一次,以免多次提交产生多次功能
    shiny
        2
    shiny  
       2015-01-30 20:59:20 +08:00   ❤️ 1
    建议 api 用 https
    另外注意重放攻击
    gdtv
        3
    gdtv  
    OP
       2015-01-30 21:02:01 +08:00
    @NewYear 多谢,这两个也加上
    xoxo
        4
    xoxo  
       2015-01-30 21:03:27 +08:00   ❤️ 1
    不够安全,appid或者app_id呢,你只给一个人用吗?

    然后还有注意for update(重放)攻击
    iyaozhen
        5
    iyaozhen  
       2015-01-30 21:04:46 +08:00
    感觉不够,容易猜出key。
    如果说内部数据的接口,还需再加强。@NewYear 的方法挺不错
    NewYear
        6
    NewYear  
       2015-01-30 21:42:04 +08:00   ❤️ 1
    @iyaozhen 忘记看了 hash别用md5了 用sha256之类的吧 hash长点更有安全感

    或者自己修改md5函数 别人得不到你的算法 就不知道你的hash怎么计算 自然也就无法破解了
    cevincheung
        7
    cevincheung  
       2015-01-30 21:48:40 +08:00
    @NewYear

    sha256+1
    gdtv
        8
    gdtv  
    OP
       2015-01-30 21:52:28 +08:00
    @xoxo 是只给一个人用
    hgc81538
        9
    hgc81538  
       2015-01-30 21:55:36 +08:00   ❤️ 1
    invite
        10
    invite  
       2015-01-30 22:03:02 +08:00   ❤️ 1
    @NewYear 在这个场景里, SHA 没有比 MD5 更安全. 自己修改MD5函数也没意义, API本来就要在client和server共同使用, 所以代码必然是开放给client的.

    @gdtv 用公钥/私钥更好.
    gdtv
        11
    gdtv  
    OP
       2015-01-30 22:44:29 +08:00
    @invite 在我这个需求里client和server都是自己公司的网站,不会开放给别人使用
    mcfog
        12
    mcfog  
       2015-01-30 23:17:51 +08:00
    @gdtv 都是自己的站的话考虑直接IP白名单吧
    halfcrazy
        13
    halfcrazy  
       2015-01-31 02:19:18 +08:00
    一般是hmac加一个自定义的key吧
    konakona
        14
    konakona  
       2015-01-31 02:33:26 +08:00   ❤️ 1
    我給樓主一個最簡單的例子,也如1樓所說,正式微信的做法:
    http://mp.weixin.qq.com/wiki/4/2ccadaef44fe1e4b0322355c2312bfa8.html


    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp 时间戳
    nonce 随机数
    echostr 随机字符串


    加密/校验流程如下:
    1. 将token、timestamp、nonce三个参数进行字典序排序
    2. 将三个参数字符串拼接成一个字符串进行sha1加密
    3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    iyaozhen
        15
    iyaozhen  
       2015-04-01 00:03:13 +08:00
    今天也写了一个接口验证方法,又翻到这个帖子,验证基本参照微信公众号来的。不过如果服务端不做进一步验证的话还是非常有可能被重放攻击。
    1楼 @NewYear 说的太经典了,当时看帖子的时候理解不是很透彻。

    不过要是前端js的话就比较悲剧了,token直接暴露了,要验证的话就需要别的方法了。
    NewYear
        16
    NewYear  
       2015-04-01 01:01:31 +08:00   ❤️ 1
    @iyaozhen 主要是 限制时间 随机值 签名 最好是过一段时间换一下安全码
    dryyun
        17
    dryyun  
       2015-05-13 21:32:42 +08:00
    @NewYear 问一下,如果前端,或者app端的本地时间不准,相差几分钟,几小时,那么时间戳这个验证就通不过了?app 的请求就是判断非法?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1076 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:47 · PVG 02:47 · LAX 11:47 · JFK 14:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.