您正在查看: 2018年3月

php使用openssl来实现非对称加密签名,用于接口间安全传输数据

使用非对称加密主要是借助openssl的公钥和私钥,用公钥加密私钥解密,或者私钥加密公钥解密。
1.linux需要安装openssl和php的openssl扩展
2.生成私钥:openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护


openssl genrsa -out rsa_private_key.pem 1024
3.生成公钥:rsa命令用于处理RSA密钥、格式转换和打印信息

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem  
4.测试代码

<?php
//密钥
$secret = 'e10adc3949ba59abbe56e057f20f883e';

//测试数据
$_POST = array();
$_POST['id'] = 1;
$_POST['name'] = 'zhansan';

//生成签名
$sign = MakeSign($_POST, $secret);

$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAbfx4VggVVpcfCjzQ+nEiJ2DL
nRg3e2QdDf/m/qMvtqXi4xhwvbpHfaX46CzQznU8l9NJtF28pTSZSKnE/791MJfV
nucVcJcxRAEcpPprb8X3hfdxKEEYjOPAuVseewmO5cM+x7zi9FWbZ89uOp5sxjMn
lVjDaIczKTRx+7vn2wIDAQAB
-----END PUBLIC KEY-----';

//打印签名
echo $sign;
echo '<br>';

//利用公钥加密签名
openssl_public_encrypt($sign, $token, $public_key); 
//token为加密的sign,后面用私钥解密获取sign
$token = base64_encode($token);

//打印token
echo $token;
echo '<br>';

//rsa 私钥
$private_key='-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDAbfx4VggVVpcfCjzQ+nEiJ2DLnRg3e2QdDf/m/qMvtqXi4xhw
vbpHfaX46CzQznU8l9NJtF28pTSZSKnE/791MJfVnucVcJcxRAEcpPprb8X3hfdx
KEEYjOPAuVseewmO5cM+x7zi9FWbZ89uOp5sxjMnlVjDaIczKTRx+7vn2wIDAQAB
AoGAZzUWajxKTZeJqh5FjBgmwZi5M7voFynZAjRWAkCkqZye0FfY7e70kA92C1AL
aVqySnNr4WYZuGorEeOFGqHIv1XSowTLgfLkVBZ/SXiep2QYJrR0YevjysvLnTfb
mrdWCqWSj+0AlQg+AvDA/qtvBVMxKymbpo+4bj5H2pPPZ1ECQQDi1PwJQJBYPbpL
vGmP3AmWg467tCeQ+aJGgtQTOK5BH+p0BWFVDX583R437vllkKI8EXgZfqQfsQcj
7XUAXyZVAkEA2SyFbO8roH9JLrEoxxKGeiGZvhPfNl9nXLhX0OFS0ywQaVBJno39
9W5bX5iP5Jzeb3UWsZ/TxzhGc/b4WjAlbwJBAOFuIn1feRT5Y+hY++BJIg4/+N57
EMd4ENpas0HXFvcKLQvZPP42Rvr5FksoaRuTPmjMQ7uyrJICccI3AAy6g3ECQQDE
AyH9+zRmLNxRj0advsOvUcpgu7DYc21oS12/Qs+tl3TMiNGZkNDphwxjkOA217sP
4B92fCn6AnncSslHJXNzAkBo6ujxqIfrZMOG3ON9nXxkWlq39GFS6CzXWscHA3Xz
FMVT1WWU3FR2Kf2QSKiMGv02YcI2xfowim3JnT6600N0
-----END RSA PRIVATE KEY-----';




$token = base64_decode($token);
//利用私钥解密获取sigi签名
openssl_private_decrypt($token, $sign2, $private_key); 

//打印sign
echo $sign2;
echo '<br>';

if($sign2 == MakeSign($_POST, $secret)){
    exit('token校验成功');
}else{
    exit('token校验失败') ;
}




 /**
 * 生成签名
 * 备注:sign不参与签名
 * $data # 数组
 * $secret # 密钥
 */
function MakeSign($data = '', $secret = '')
{
    //签名步骤一:按字典序排序参数
    ksort($data);
    //签名步骤二:格式化成url参数
    $buff = "";
    foreach ($data as $k => $v)
    {
        if($k != "sign"){
            $buff .= $k . "=" . $v . "&";
        }
    }
    $string = trim($buff, "&");
    //签名步骤三:在string后加入KEY
    $string = $string . "&secret=".$secret;
    //签名步骤四:MD5加密
    $string = md5($string);
    //签名步骤五:所有字符转为大写
    $result = strtoupper($string);
    return $result;
}

测试结果

签名
AB1FAD5119B796DD87FAF8C88D57EF86
加密后的签名用于传输
sEHmlQqxShwDYcoEEDwIh7Aa7BYDbvOQmVUqlPppwWLpta4+Xxb+GTaQopsuKBgQ1sJgQahuOjvohHuSgj9tRQt4VtqItHyEA+Yj8NNZcZzxMB5AoLeVkc+D51A2jBkksiujdUCMNMjCaF8L/BhHGZaaXK5GOk6E4HPIIkeOU6o=
解密后的签名
AB1FAD5119B796DD87FAF8C88D57EF86
判断签名是否一致,校验成功

Macbook MAMP扩展安装指南,pdo_dblib扩展安装,Home-brew安装

Linux下安装pdo_dblib扩展参考我的另一篇文章:https://fores.cc/index.php/archives/21/

由于最近项目需要使用php链接SQL server操作,所以写下php扩展环境安装操作说明
先从Apple Store下载Xcode,然后安装Xcode
接着安装Homebrew包管理,类似于centos下的yum,类似于Ubuntu下的apt-get,后面就可以借助brew安装各种包
终端下输入:


ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
1.安装unixodbc

brew install unixodbc
2.安装freetds,非windows环境访问sql server数据库需要这个证

brew install freetds --with-unixodbc
3.安装php pdo_dblib扩展

brew search pdo-dblib
搜索找到各种php版本的扩展 homebrew/php/php53-pdo-dblib homebrew/php/php56-pdo-dblib homebrew/php/php54-pdo-dblib homebrew/php/php70-pdo-dblib homebrew/php/php55-pdo-dblib homebrew/php/php71-pdo-dblib 我的版本是7.1.5所以我选择安装homebrew/php/php71-pdo-dblib

brew install homebrew/php/php71-pdo-dblib
最后我们可以在终端看到安装的位置在

==> Summary
/usr/local/Cellar/php71-pdo-dblib/7.1.14_20: 7 files, 181KB
4.配置php.ini文件 打开MAMP界面,点php,找到Manually enable other extensions 如果找不到文件,可以通过终端全局搜索,find / -name 'php.ini' 将下面这行加入php.ini配置文件

extension=/usr/local/Cellar/php71-pdo-dblib/7.1.14_20/pdo_dblib.so
5.重启MAMP我们写个phpinfo()函数看下已安装成功

Linux系统下ThinkPHP5链接SQL Server数据库,FreeTDS安装,pdo_dblib扩展安装

linux版本:64位CentOS 6.8

Nginx版本:1.12.0

php版本:7.1.5

Sqlserver版本:2008

1.首先需要编译安装FreeTDS 官网:http://www.freetds.org/software.html
注意根据你SQL Server版本来选择,我的是2008所以填写7.3, --with-tdsver=7.3 参考链接 http://www.freetds.org/userguide/choosingtdsprotocol.htm


    # wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz
    # tar -zxvf freetds-patched.tar.gz
    # cd freetds-1.00.83  #解压以后的路径自己看,这个不一定对
    # ./configure --prefix=/usr/local/freetds --with-tdsver=7.3 --enable-msdblib  
    # make && make install


2.验证FreeTDS版本,这一步非常重要,通过才可以继续,不然后面的步骤都是无意义的。
首先看看版本信息


    # /usr/local/freetds/bin/tsql -C


测试数据库是否联通


    # /usr/local/freetds/bin/tsql -H 数据库服务器IP  -p 端口号 -U 用户名 -P 密码  ##端口号一般是1433

3.安装PHP的安装pdo_dblib扩展
http://php.net/downloads.php
上php官网下载对应php版本的源码包找到里面的扩展来安装 我的是7.1.5所以我下载的是7.1的版本
linux下用phpize给PHP动态添加扩展
phpize不同服务器位置可能不一样,你可以通过whereis phpize查找位置,或者 find / -name 'phpize'查询位置
执行./configure 如果你的php不是安装在/usr/local路径下 你要修改为自己的php路径


    #cd php-7.1.15/ext/pdo_dblib
    # /usr/local/php/bin/phpize
    # ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds/
    # make && make install


4.在php.ini配置文件中增加扩展 .so
同上,如果php配置文件不在这里,你可以通过whereis php.ini查找未知,或者 find / -name 'php.ini'查询位置


    #vim /usr/local/php/etc/php.ini
    ##在php配置文件里添加一行
    extension=pdo_dblib.so


5.最后重启php-fpm,可以通过phpinfo()方法查看pdo_dblib扩展是否安装成功


# service php-fpm restart


6.下载附件里面的php类库,配置database.php文件


dblib驱动类库下载:https://fores.cc/usr/uploads/2018/03/1252872861.zip
下载链接2: https://pan.baidu.com/s/1CwYXcRs8F2_hs7lNoaN2Nw 密码: ig3w
下载附件并复制数据库驱动扩展文件到ThinkPHP的文件中
文件放到主程序下 /thinkphp/library/think/db 下方

修改database.php文件里的 type 为 dblib
return [
    // 数据库类型
    'type'            => 'dblib',
    // 服务器地址
    'hostname'        => '',
    // 数据库名
    'database'        => '',
    // 用户名
    'username'        => '',
    // 密码
    'password'        => '',
    // 端口
    'hostport'        => '1433',
    // 连接dsn
    'dsn'             => '',
    // 数据库连接参数
    'params'          => [],
    // 数据库编码默认采用utf8
    'charset'         => 'utf8',
    // 数据库表前缀
    'prefix'          => '',
    // 数据库调试模式
    'debug'           => true,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy'          => 0,
    // 数据库读写是否分离 主从式有效
    'rw_separate'     => false,
    // 读写分离后 主服务器数量
    'master_num'      => 1,
    // 指定从服务器序号
    'slave_no'        => '',
    // 是否严格检查字段是否存在
    'fields_strict'   => true,
    // 数据集返回类型
    'resultset_type'  => 'array',
    // 自动写入时间戳字段
    'auto_timestamp'  => false,
    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',
    // 是否需要进行SQL性能分析
    'sql_explain'     => false,
];