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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值