- 请求身份是否合法?
- 请求参数是否被篡改?
- 请求是否唯一?
AccessKey&SecretKey (开放平台)
请求身份
防止篡改
-
按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA; -
在stringA最后拼接上Secretkey得到字符串stringSignTemp; -
对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。
重放攻击
实现
http://api.test.com/test?name=hello&home=world&work=java
-
生成当前时间戳timestamp=now和唯一随机字符串nonce=random -
按照请求参数名的字母升序排列非空请求参数(包含AccessKey) stringA="AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random";
-
拼接密钥SecretKey stringSignTemp="AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random&SecretKey=secret";
-
MD5并转换为大写 sign=MD5(stringSignTemp).toUpperCase();
-
最终请求 http://api.test.com/test?name=hello&home=world&work=java×tamp=now&nonce=nonce&sign=sign;
Token&AppKey(APP)
Token身份验证
-
用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后返回Token给客户端; -
客户端将Token保存在本地,后续发起请求时,携带此Token; -
服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。 -
安全隐患:Token被劫持,伪造请求和篡改参数。
Token+AppKey签名验证
实现
登陆和退出流程
后续请求
-
和上述开放平台的客户端行为类似,把AccessKey改为token即可。
0 条评论