2017-03-24 2 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 디코드를 사용한 다음 다시 인코딩하십시오. 그런 다음 새로 인코딩 된 데이터를 새 테이블에 INSERT합니다. 내가 너의 질문을 이해한다면. 다른 사람들처럼 암호를 저장하려고하지 말라고 말하면 – 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 제어기

관련 문제