thinkphp 对数据库会员表的某几个字段进行数据加密解密。

前几天经理突然说我有个注意,我们把我们客户的数据库里的几个主要字段进行加密吧,防止别人通过非法手段获取数据库后对客户有影响。

说做就做,我们初始决定对会员表的手机、身份证、银行卡号进行加密。

在会员生成保存数据库的时候,我们手动的把这3个字段通过加密保存到数据库里。会员表是inkks_users

加密方法是在网上找的,支持通过特殊字符串进行加密解密。在公共函数文件里添加了4个方法。

//数据库查询封装加密数据
function enWhereAndOr($options){
$jmarray=array("mobile","bankno","idcard");
foreach($jmarray as $v){
if(array_key_exists($v,$options['AND'])){
if(is_array($options['AND'][$v])){
$options['AND'][$v][1]=encrypt($options['AND'][$v][1]);
}else{
$options['AND'][$v]=encrypt($options['AND'][$v]);
}
}
if(array_key_exists($v,$options['OR'])){
if(is_array($options['OR'][$v])){
$options['OR'][$v][1]=encrypt($options['OR'][$v][1]);
}else{
$options['OR'][$v]=encrypt($options['OR'][$v]);
}
}
}
return $options;
}
//数据库修改封装加密数据
function enUpdate($data){
$jmarray=array("mobile","bankno","idcard");
foreach($jmarray as $v){
if(array_key_exists($v,$data)){
$data[$v]=encrypt($data[$v]);
}
}
return $data;
}
//数据库查询封装解密数据
function edList($resultSet){
$jmarray=array("mobile","bankno","idcard");
foreach($jmarray as $v){
foreach ($resultSet as $key => $val){
if(array_key_exists($v,$val)){
$resultSet[$key][$v]=encrypt($val[$v],"D");
}
}
}
return $resultSet;
}

//数据加密
function encrypt($string,$operation,$key=''){
//$key = $_SERVER['SERVER_NAME'];
$key = "192.168.0.192";//通过此处修改加密的key
$key=md5($key);
$key_length=strlen($key);
$string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;
$string_length=strlen($string);
$rndkey=$box=array();
$result='';
for($i=0;$i<=255;$i++) {
$rndkey[$i]=ord($key[$i%$key_length]);
$box[$i]=$i;
}
for($j=$i=0;$i<256;$i++) {
$j=($j+$box[$i]+$rndkey[$i])%256;
$tmp=$box[$i];
$box[$i]=$box[$j];
$box[$j]=$tmp;
}
for($a=$j=$i=0;$i<$string_length;$i++) {
$a=($a+1)%256;
$j=($j+$box[$a])%256;
$tmp=$box[$a];
$box[$a]=$box[$j];
$box[$j]=$tmp;
$result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
}
if($operation=='D'){
if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){
return substr($result,8);
}else{
return'';
}
}else{
return str_replace('=','',base64_encode($result));
}
}

 

然后修改db里的 \thinkphp\library\think\db\Query.php 里的update和select

update 在生成UPDATE SQL语句之前进行判断修改

 

if($options['table']=="inkks_users"){
$data = enUpdate($data);
}

// 生成UPDATE SQL语句
$sql = $this->builder->update($data, $options);

 

select在执行查询操作的下边进行判断修改

// 执行查询操作
$resultSet = $this->query($sql, $bind, $options['master'], $options['fetch_pdo']);

if($options['table']=="inkks_users"){
$resultSet = edList($resultSet);
}

修改db里的 \thinkphp\library\think\db\Builder.php 里的update和select

在$sql的上边加上

if($options['table']=="inkks_users"){
$options['where']=enWhereAndOr($options['where']);

}

 

写到这里就ok了,只要不是原生态的sql 或者直接在where(‘’)里写  tp自动会通过判断会我们的数据进行加密解密。

写的不好,请多多指教。。。。。。

转载于:https://www.cnblogs.com/waczq/p/9358555.html

你可能感兴趣的:(数据库,php)