Php 枚举mysql表并加密字段
我正在进行从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语句中解码和编码的方法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数据。(不是
有什么想法吗?我想出了一个解决方案,将旧的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 controllerSHA1是单向哈希函数,无法恢复原始输入。AES-256是可恢复的加密,原始输入可以恢复。不要加密密码,当攻击者获得DB时,他也将获得加密密钥。用随机盐在HMAC上迭代大约100毫秒,并用散列保存盐。使用诸如**
password\u hash
、PBKDF2
、Bcrypt
等函数和类似函数。关键是让攻击者花费大量时间通过暴力手段查找密码。使用PHPpassword\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