2017-04-18 1 views
0

AES로 암호화 된 테이블의 필드를 사용하여 PHP를 통해 MySQL 테이블을 쿼리하는 올바른 방법을 찾으려고합니다. 나는 last_name과 몇 가지 다른 필드를 잡아서 비교할 쿼리를하는 로그인 폼을 가지고있다. 다음은 관련 구조의 간략한 설명입니다. PHP MySQL에서 사용자 입력 및 암호화 된 데이터를 쿼리/비교

나는 사용하여 데이터를 삽입 :

AES_ENCRYPT('".$last_name."','".$encryption_key."') 

내가 해독 할 수 있으며, 출력 데이터를 사용하여 :

CAST(AES_DECRYPT(last_name, '$encryption_key') AS CHAR(66)) last_name_decrypt 

그러나 나는이 일을 비교 얻을 수 없습니다. 시도했습니다.

$query = "SELECT * from {$tablename} where last_name = AES_ENCRYPT('".$unauth_last_name."','".$encryption_key."')"; 

도움이나 의견을 보내 주시면 감사하겠습니다.

+0

정리해 주셔서 감사합니다. @Shadow – Johanna

+0

'lastname' 필드가'last_name' 필드 (밑줄)와 다른가요? 그렇다면 암호화되지 않은 형식으로도 사용할 수있는 경우 암호화 된 형식으로 성을 저장하는 것이 무엇입니까? PHP 코드의 입력을 데이터베이스에 저장된 것과 어디에서 비교합니까? 이 방법으로 필드 레벨 암호화를 사용하면 암호화 된 키가 비밀이기 때문에 안전한 데이터를 만들 수 없습니다. MySQL 내에서 데이터를 암호화하는 다른 방법을 확인하고 싶을 수도 있습니다. 체크 아웃 : https://www.mysql.com/products/enterprise/encryption.html – Shadow

+0

아니요 코드를 수정하고 성은 last_name이어야합니다. – Johanna

답변

2

나는 당신이 php에서 얻은 마지막 이름과의 비교를 놓치고 있다고 생각한다 - 아마 로그인 HTML 폼에서.

$query = "SELECT * from {$tablename} WHERE last_name = AES_ENCRYPT('".$in_last_name."','".$encryption_key."')"; 

을 (물론 당신은 당신의 입력을 소독 또는 매개 변수를 사용하여 준비된 문을 사용한다 : 다음과 같은 성을 유지하는 PHP 변수는 $in_last_name라고에 대해 확인하고 싶다고 가정하면, 쿼리는 SG처럼 보일 수 있습니다 바인딩을 사용하여 SQL 주입 공격을 막을 수 있습니다. MySQL에 연결하는 데 사용하는 API를 알지 못하기 때문에 이에 대한 정확한 해결책을 제안 할 수는 없습니다.

쿼리는 성 (일반 텍스트)을 입력하고 저장된 암호화 된 데이터와 대조합니다. 또한 where 절에 필드 별칭이 없어야합니다.

다시 필드 레벨 암호화를 사용하면이 방법으로 암호화 된 키가 비밀이기 때문에 안전하지 않은 데이터를 만들지 않습니다. 이러한 암호화는 당신의 삶을 더욱 어렵게 만듭니다.

MySQL 내의 다른 데이터 암호화 방법을 확인하십시오. 예를 들어 MySQL Enterprise Encryption을 확인하십시오. DBA는 일반 텍스트 버전에 실제로 액세스하지 않고도 암호화 된 데이터를 관리 할 수 ​​있습니다. 예, 이것은 무료 제품이 아닙니다.

+0

나는 의견에 감사 드리며, 감사합니다. – Johanna

관련 문제