2017-03-24 3 views
-1

私はCI 1.2からCI 3.xへのアップグレードを進めています。私はCI 1.xでSHA1でエンコードされた11のフィールドを持つ3つのテーブルを持っています。 CI 3はAES-256を使用します。実際には、有効なSQLではないUPDATE tablex set(fielda = $ this-> encrypt-> encode_from_legacy(fielda))を実行する必要があります。mysqlテーブルを列挙してフィールドを暗号化します

ターゲットテーブルの各行を列挙し、その行をエンコード関数の結果で更新するにはどうすればよいですか?

さまざまな暗号とモードを使用して、ネイティブSQL文をデコードしてエンコードする方法は考えられません。

どのような考えですか?

+0

SHA1は、元の入力**回収することができない、一方向ハッシュ関数です。 AES-256は元の入力**を回復できる回復可能な暗号化です。 – zaph

+0

**パスワードを暗号化しない**、攻撃者がDBを取得したときにも暗号化キーを取得します。約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 ** 'password_hash'、' PBKDF2'、 'Bcrypt'などの関数を使用してください。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。 PHPでは 'password_hash'と' password_verify'が間違いなく最適な解決策です。 – zaph

+0

あなたは変換するレコードを '選択 'しなければならないでしょう。 PHPデコードしてから再エンコードしてください。新しくエンコードされたデータを新しいテーブルに挿入します。私はあなたの質問を理解する場合。他のみんなが言ったように、パスワードを保存するために自分で試してはいけないと言っています – Austin

答えて

0

ここでは、古いMD5ハッシュデータをAES-256データに再暗号化するためのソリューションを紹介します。 (PASSWORDデータではない)。

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 

} //端recryptコントローラ

関連する問題