开发一个网站 api 接口要加验证,请帮忙看下我的方法是否安全 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gdtv
V2EX    问与答

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

  •  
  •   gdtv 2015 年 1 月 30 日 8770 次点击
    这是一个创建于 4084 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 年 1 月 30 日   3
    不够 还要加上当前时间 以及一个随机字符

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

    然后还有注意for update(重放)攻击
    iyaozhen
        5
    iyaozhen  
       2015 年 1 月 30 日
    感觉不够,容易猜出key。
    如果说内部数据的接口,还需再加强。@NewYear 的方法挺不错
    NewYear
        6
    NewYear  
       2015 年 1 月 30 日   1
    @< href="/member/iyaozhen">iyaozhen 忘记看了 hash别用md5了 用sha256之类的吧 hash长点更有安全感

    或者自己修改md5函数 别人得不到你的算法 就不知道你的hash怎么计算 自然也就无法破解了
    cevincheung
        7
    cevincheung  
       2015 年 1 月 30 日
    @NewYear

    sha256+1
    gdtv
        8
    gdtv  
    OP
       2015 年 1 月 30 日
    @xoxo 是只给一个人用
    hgc81538
        9
    hgc81538  
       2015 年 1 月 30 日   1
    invite
        10
    invite  
       2015 年 1 月 30 日   1
    @NewYear 在这个场景里, SHA 没有比 MD5 更安全. 自己修改MD5函数也没意义, API本来就要在client和server共同使用, 所以代码必然是开放给client的.

    @gdtv 用公钥/私钥更好.
    gdtv
        11
    gdtv  
    OP
       2015 年 1 月 30 日
    @invite 在我这个需求里client和server都是自己公司的网站,不会开放给别人使用
    mcfog
        12
    mcfog  
       2015 年 1 月 30 日
    @gdtv 都是自己的站的话考虑直接IP白名单吧
    halfcrazy
        13
    halfcrazy  
       2015 年 1 月 31 日
    一般是hmac加一个自定义的key吧
    konakona
        14
    konakona  
       2015 年 1 月 31 日   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 年 4 月 1 日
    今天也写了一个接口验证方法,又翻到这个帖子,验证基本参照微信公众号来的。不过如果服务端不做进一步验证的话还是非常有可能被重放攻击。
    1楼 @NewYear 说的太经典了,当时看帖子的时候理解不是很透彻。

    不过要是前端js的话就比较悲剧了,token直接暴露了,要验证的话就需要别的方法了。
    NewYear
        16
    NewYear  
       2015 年 4 月 1 日   1
    @iyaozhen 主要是 限制时间 随机值 签名 最好是过一段时间换一下安全码
    dryyun
        17
    dryyun  
       2015 年 5 月 13 日
    @NewYear 问一下,如果前端,或者app端的本地时间不准,相差几分钟,几小时,那么时间戳这个验证就通不过了?app 的请求就是判断非法?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     818 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:49 PVG 05:49 LAX 14:49 JFK 17:49
    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