老师咨询关于接口的问题
来源:9-4 实现Token身份权限体系二---获取openid
justin_郑
2017-09-26
我开发API接口的安全验证,用时间戳、随机数、token通过一个算法生成签名,在调用接口的时候,我把时间戳、随机数和生成的签名发送给后台,后台再通过时间戳、随机数和token 生成签名再判断是否正确。我一直想不通的是 前端要是被破解了(js代码很容易看到) 就会知道token和生成签名的算法,就没有安全可言了? 我的这种安全方式是不是哪里还不正确?
写回答
2回答
-
justin_郑
提问者
2017-09-26
这里我并没有实际的前台,直接使用一个PHP文件代替前台
源代码 <?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/3/16 0016 * Time: 15:56 */ namespace Client\Controller; use Think\Controller; class ClientController extends Controller{ const TOKEN = 'API'; //模拟前台请求服务器api接口 public function getDataFromServer(){ //时间戳 $timeStamp = time(); //随机数 $randomStr = $this -> createNonceStr(); //生成签名 $signature = $this -> arithmetic($timeStamp,$randomStr); //url地址 $url = "http://www.apitest.com/Server/Server/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}"; $result = $this -> httpGet($url); dump($result); } //curl模拟get请求。 private function httpGet($url){ $curl = curl_init(); //需要请求的是哪个地址 curl_setopt($curl,CURLOPT_URL,$url); //表示把请求的数据已文件流的方式输出到变量中 curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); $result = curl_exec($curl); curl_close($curl); return $result; } //随机生成字符串 private function createNonceStr($length = 8) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return "z".$str; } /** * @param $timeStamp 时间戳 * @param $randomStr 随机字符串 * @return string 返回签名 */ private function arithmetic($timeStamp,$randomStr){ $arr['timeStamp'] = $timeStamp; $arr['randomStr'] = $randomStr; $arr['token'] = self::TOKEN; //按照首字母大小写顺序排序 sort($arr,SORT_STRING); //拼接成字符串 $str = implode($arr); //进行加密 $signature = sha1($str); $signature = md5($signature); //转换成大写 $signature = strtoupper($signature); return $signature; } }
如果这个是前台的js代码 token就很清楚的知道 ,算法也清楚了?
00 -
7七月
2017-09-26
看到token怎么就能破解出算法来呢,像md5这些都是不可逆的算法。不是说觉得不可能,只是普通的人很难。现在都是采用这种方式,没有绝对的安全,只有相对的安全。
012017-09-26
相似问题