https://www.cnblogs.com/bjfy/p/5909690.html
生成token
public function createToken()
{
$str = md5(uniqid(md5(microtime(true)),true)); //生成一个不会重复的字符串
$str = sha1($str); //加密
return $str;
}
接口开发中为了防止接口被恶意调用,可以设置签名验证。首先可以设置一个密钥key ,就是一个比较长的字符串,然后设置一定的签名规则,例如将所有的参数进行字典排序封装成一个字符串,连接密钥,再进行md5加密,就生成了所谓的签名。
public function create_sign()
{
//参数中含有sign
$params = $this->request->all();
if (array_key_exists('sign', $params) === false) {
return '';
}
unset($params['sign']);
if (count($params) >= 1) {
//参数字典排序
ksort($params);
$str = '';
$i = 0;
foreach ($params as $key => $val) {
if ($i == 0) {
$str .= $key . "=" . $val;
} else {
$str .= "&" . $key . "=" . $val;
}
$i++;
}
return md5($str . $this->key);
}
return '';
}
这个密钥一般是一个用户对应一个密钥,但是也是不安全的。
最常用的签名方法就是RSA 签名,这个网上有很多资料,具体不再详解。今天主要记录一下 ECDSA签名验证,以及公私钥生成的方法,当然是借助于php的内置函数openssl。
$config = array(
"private_key_type" => OPENSSL_KEYTYPE_EC,
'curve_name'=>'secp256k1',
'digest_alg'=>'sha256',
);
$resource=openssl_pkey_new($config);
//只能导出私钥
//openssl_pkey_export($kk,$pp,'33',$config);
$info=openssl_pkey_get_details($resource);
$public_key=$info['key'];
openssl_pkey_export($resource, $privkey,'33',$config);
$kk=openssl_pkey_get_private($privkey,'33');
openssl_sign('123456',$str,$kk,OPENSSL_ALGO_SHA256);
在变量config中可以直接指定openssl支持的验簽类型,RSA ,当然这里是EC 就是椭圆曲线算法。生成签名使用了openssl_sign 函数。
$mm='MEUCICLD6Mo3166dlJVdwueYyl4pJT5fYSm7G5rJPGiZqq0KAiEAheaOI7Bqeu+M1kCK1C4Oj3B5T3gR8zH/Q6zH4E4Vvi4=';
$keyData = file_get_contents(base_path()."/cert.pem");
$int=openssl_verify('123456',base64_decode($mm),$keyData,OPENSSL_ALGO_SHA256);
验簽工作中忽略了指定生成摘要的算法,采用了默认的摘要算法:sha1 而我生成签名采用的sha256,所以浪费了好多时间。很好用,不用关心算法的具体实现。