在 EAN 的API接口文档中,关于签名的说明如下:
http://developer.ean.com/docs/translations/zh-cn/getting-started/api-authentication
使用数字签名时,sig 值的计算方法是,生成包含 API 密钥、API 用户共享秘密以及 UNIX 时间戳的 MD5 哈希值。
系统接受早于或晚于服务器时间戳长达五分钟的时间戳,以顺应合理的时间漂移。
签名 = MD5($"{API 密钥}{API 用户共享秘钥}{UNIX 时间戳}")
很想了解他们是如何通这个签名来判断是不是前后5分钟之内的操作的。。
有没有做过相关的?请指教。
-------------------------------
补充说明:
也就是说,我把时间调早或晚5分钟以上,这个请求是无效的。我就好奇这个,他们是怎么做到的。
我手动改过时间,5分钟以外的,确实是无效请求。
你签名只是用来保证你信息没有被篡改过,但你原始信息还是要带过去的。
看题
也就是说,我把时间调早或晚5分钟以,这个请求是无效的。我就好奇这个,他们是怎么做到的。
@xling: 你那文档例子不是说明了么,原文是带在sig里的。
@xling: 仔细看了下,时间戳是没带过去,如果非要实现也不是不行,也就是600次比较。不过这种做法很2b.
@xling: 整个hash中除了时间戳服务端是知道的,那么就暴力的从5分钟前的时间戳到5分钟后的时间戳一个个的计算hash一次做比较。
@Daniel Cai: 如果没有其它办法,600次也可能。。。这些JAVA大牛B。。。大牛B。。。
@Daniel Cai: 岂止是2B,简直就是傻逼。。。
@顾晓北: 也不一定是没用,那个md5的hash太简单了,如果再把时间戳放明文里面,暴力破解出前面两个定值(实际上可以看为是一个)就简单很多。当然如果真的是这个原因也的确很2b的。
你的时间戳不传过去?
请求里只有 API KEY 个,并没有 时间戳。
如果有时间戳,傻子也知道怎么比较。
@xling: 有点扯吧?时间戳不传过去,你连签名对不对都不知道,有毛用???
@顾晓北: 搞的好像我骗你一样,原文中的这个示例地址,你看:
http://api.ean.com/ean-services/rs/hotel/v3/avail? cid=[yourCID] &apiKey=[yourAPIKey] &sig=[youSigValue] &minorRev=[current minorRev #] &customerUserAgent=[xxx] &customerIpAddress=[xxx] &locale=en_US ¤cyCode=USD &hotelId=201252