Php 枚举mysql表并加密字段

Php 枚举mysql表并加密字段,php,mysql,codeigniter,encryption,encode,Php,Mysql,Codeigniter,Encryption,Encode,我正在进行从CI 1.2到CI 3.x的升级。我有3个表和11个字段,它们在ci1.x中用SHA1编码。CI 3使用AES-256。实际上,我需要执行一个更新tablex集(fielda=$this->encrypt->encode_from_legacy(fielda)),它不是有效的SQL 如何枚举目标表的每一行并用编码函数的结果更新该行 我想不出用不同的密码和模式在原生SQL语句中解码和编码的方法 有什么想法吗?我想出了一个解决方案,将旧的MD5哈希数据重新加密为AES-256数据。(不是

我正在进行从CI 1.2到CI 3.x的升级。我有3个表和11个字段,它们在ci1.x中用SHA1编码。CI 3使用AES-256。实际上,我需要执行一个更新tablex集(fielda=$this->encrypt->encode_from_legacy(fielda)),它不是有效的SQL

如何枚举目标表的每一行并用编码函数的结果更新该行

我想不出用不同的密码和模式在原生SQL语句中解码和编码的方法


有什么想法吗?

我想出了一个解决方案,将旧的MD5哈希数据重新加密为AES-256数据。(不是密码数据)

函数更新($query=null){
$this->load->library('encrypt');//过时的MD5(不支持PHP7.x)
$this->load->library('encryption');//CIv3 AES-256
$dbobject=array(
“约会”=>array('completion_notes'),
'health_profiles'=>数组('过敏',
“怀孕史”,
"药物",,
“住院”,
“社会历史”,
“个人疾病”,
“家庭疾病”,
“高度”,
‘重量’)
);
foreach($dbobject作为$table=>$fields){
回显“固定表:.”表“
”; $query=$this->db->get($table)->result_array(); foreach($queryas$row){ foreach($fields作为$field){ //从旧版MD5解密到AES-256 $after=$this->encryption->encrypt( $this->encrypt->decode( $this->encrypt->encode_from_legacy($row[$field]); $sql_set=$field.“='”、“$after.”; }//结束foreach字段 //删除最后一个逗号 $sql\u set=substr\u replace($sql\u set,“,-1); 交换机($表){ “任命”一案: $primarykey=“预约号”; 打破 案例“健康状况简介”: $primarykey=“健康状况\个人资料\ id”; 打破 }//结束开关 echo“为主键加密数据:”.$row[$primarykey]。“
”; $this->db->simple_query('update'.$table.'set'.$sql_set.'where'.$primarykey.=''.$row[$primarykey].''); }//每行结束 }//结束foreach表 }//结束createUpdates

}//end recrypt controller

SHA1是单向哈希函数,无法恢复原始输入。AES-256是可恢复的加密,原始输入可以恢复。不要加密密码,当攻击者获得DB时,他也将获得加密密钥。用随机盐在HMAC上迭代大约100毫秒,并用散列保存盐。使用诸如**
password\u hash
PBKDF2
Bcrypt
等函数和类似函数。关键是让攻击者花费大量时间通过暴力手段查找密码。使用PHP
password\u hash
password\u verify
可以说是最好的解决方案。您很可能需要
选择要转换的记录。使用PHP解码,然后重新编码。然后
将新编码的数据插入新表中。如果我理解你的问题。就像其他人说的,不要自己储存你关心的密码about@Austin无法从SHA1哈希恢复原始密码。我的错误。密码在civ1.x中是SHA1,但不是本文的主题。也许我需要更具体一些。我的问题与编码数据有关。这是编码的患者hippa数据。我有钥匙,我可以解码和编码数据,但我需要整体更新,并且我的可用解码/编码功能必须针对每个表中的多个字段对每个表的每一行执行。
function doUpdates ($query = null) {
    $this->load->library('encrypt');        //obsolete MD5 (PHP 7.x not supported)
    $this->load->library('encryption');     // CIv3 AES-256
    $dbobject=array(
    'appointments'    => array('completion_notes'),
    'health_profiles' => array('allergies', 
                               'pregnancy_history', 
                               'medications', 
                               'hospitalizations',
                               'social_history',
                               'personal_illness',
                               'family_illness',
                               'height',
                               'weight')
    );

    foreach($dbobject as $table=>$fields) {
        echo "Fix table: ".$table."<br/>";
        $query = $this->db->get($table)->result_array();
        foreach ($query as $row) {
            foreach($fields as $field){
               //decrypt from legacy MD5 to AES-256
               $after = $this->encryption->encrypt(
                        $this->encrypt->decode(
                            $this->encrypt->encode_from_legacy($row[$field])));
                $sql_set = $field."= '".$after."',";
            } //end foreach field

            //remove last comma
            $sql_set = substr_replace($sql_set, "", -1);

            switch ($table) {
                case "appointments":
                    $primarykey = "appointment_id";
                    break;
                case "health_profiles":
                    $primarykey = "health_profile_id";
                    break;
            } //end switch
            echo "Encrypting data for primary key: ".$row[$primarykey]."<br/>";
            $this->db->simple_query('update '.$table. " set ". $sql_set." where ".$primarykey." = '".$row[$primarykey]."'");
        }  // end for each row  
    } //end foreach table
} // end createUpdates