2013-08-15 3 views
1

내 모델에 beforeSave 및 afterFind 기능이 있습니다. 함수 암호화하고 성공적으로 문자열을 해독 :Cakephp가 RIJNDAEL로 암호 해독

public function beforeSave($options = array()) { 
    foreach($this->encryptedFields as $fieldName){ 
    if(!empty($this->data[$this->alias][$fieldName])){ 
     $this->data[$this->alias][$fieldName] = Security::rijndael($this->data[$this->alias][$fieldName], Configure::read('Security.key'), 'encrypt'); 
    } 
} 
return true; 

}

하지만. 나는이

$mobileno = 1234 
    $mobile = Security::rijndael($mobileNo, Configure::read('Security.key'), 'encrypt'); 

을하고 나서 같은 예를 들어 쿼리를 실행하는 경우 :

select * from table where mobileno = $mobileno; 

나는 결과를 얻을 캔트. 왜냐하면 지금 내가 암호화 한 mobileno이 db에있는 암호화 된 휴대 전화 번호와 다르기 때문입니다.

답변

1

Security::rijndael()은 매번 통화 할 때마다 initialization vector을 사용하기 때문입니다.

이 문제를 해결하려면 고정 IV를 사용해야하지만 이는 보안을 약화시킬 수 있으므로 좋은 생각이 아닙니다!

그런 상황에서 저는 보통 암호화되지 않은 값이 해시의 형태로 저장되는 테이블에 다른 필드를 추가합니다. 이렇게하면 선택 값을 주어진 값의 해시로 쉽게 수행 할 수 있습니다.

그런 기술을 사용할 수없는 경우 (즉, 레코드를 식별하는 데 다른 값 사용) 모든 데이터 세트를 선택하여 해독하고 문제의 레코드를 수동으로 검색 할 필요가 없을 것입니다 .

DBMS가 암호화/암호 해독을 지원하는 경우이 기능을 활용 해보십시오. PHP를 사용하여 암호 해독 및 선택보다 성능이 향상 될 수 있지만 DB 서버는 다음과 같이 가정하면 다소 안전하지 않을 수 있습니다. 키가 공격자의 손에 들어갈 수있는 곳을 두 곳으로 만들었습니다.

+0

답변 해 주셔서 감사합니다. 이제 해싱 기술을 사용할 예정입니다. – hellosheikh