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

2015-01-30 20:52:37 +08:00
 gdtv
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、接口接收到以上参数后,反向验证一下

请问这样足够安全吗?
8314 次点击
所在节点    问与答
17 条回复
NewYear
2015-01-30 20:56:57 +08:00
不够 还要加上当前时间 以及一个随机字符

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

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

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

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

@gdtv 用公钥/私钥更好.
gdtv
2015-01-30 22:44:29 +08:00
@invite 在我这个需求里client和server都是自己公司的网站,不会开放给别人使用
mcfog
2015-01-30 23:17:51 +08:00
@gdtv 都是自己的站的话考虑直接IP白名单吧
halfcrazy
2015-01-31 02:19:18 +08:00
一般是hmac加一个自定义的key吧
konakona
2015-01-31 02:33:26 +08:00
我給樓主一個最簡單的例子,也如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
2015-04-01 00:03:13 +08:00
今天也写了一个接口验证方法,又翻到这个帖子,验证基本参照微信公众号来的。不过如果服务端不做进一步验证的话还是非常有可能被重放攻击。
1楼 @NewYear 说的太经典了,当时看帖子的时候理解不是很透彻。

不过要是前端js的话就比较悲剧了,token直接暴露了,要验证的话就需要别的方法了。
NewYear
2015-04-01 01:01:31 +08:00
@iyaozhen 主要是 限制时间 随机值 签名 最好是过一段时间换一下安全码
dryyun
2015-05-13 21:32:42 +08:00
@NewYear 问一下,如果前端,或者app端的本地时间不准,相差几分钟,几小时,那么时间戳这个验证就通不过了?app 的请求就是判断非法?

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

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

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

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

© 2021 V2EX