【问题标题】:Enumerate mysql table and encrypt fields枚举mysql表并加密字段
【发布时间】:2017-08-17 18:05:26
【问题描述】:

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

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

我想不出使用不同密码和模式在本机 SQL 语句中解码和编码的方法。

有什么想法吗?

【问题讨论】:

  • SHA1 是单向哈希函数,原始输入无法恢复。 AES-256 是可恢复加密,其中原始输入可以恢复。
  • 不要加密密码,当攻击者得到数据库时,他也会得到加密密钥。使用随机盐在 HMAC 上迭代大约 100 毫秒,然后将盐与哈希一起保存。使用**password_hashPBKDF2Bcrypt等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。使用 PHP password_hashpassword_verify 可以说是最好的解决方案。
  • 您很可能需要SELECT 记录您要转换的内容。使用 PHP 解码然后重新编码。然后INSERT 新编码的数据到你的新表中。如果我理解你的问题。就像其他人所说的那样,不要自己尝试存储您关心的密码
  • @Austin 无法从 SHA1 哈希中恢复原始密码。
  • 我的错误。密码是 CI v1.x 中的 SHA1,但不是本文的主题。也许我需要更具体。我的问题与编码数据有关。这是编码的患者 hippa 数据。我有密钥,我可以对数据进行解码和编码,但我需要整体更新,并且必须为每个表的每一行执行每个表中的多个字段的可用解码/编码功能。

标签: php mysql codeigniter encryption encode


【解决方案1】:

这是我想出的将旧的 MD5 散列数据重新加密为 AES-256 数据的解决方案。 (不是密码数据)。

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

} // 结束重加密控制器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2013-07-10
    • 2011-09-05
    相关资源
    最近更新 更多