2011-01-30 1 views
4

데이터베이스를 손상 시키면 공개되지 않도록 암호화를 사용하여 MySQL 데이터베이스에 사용자의 전자 메일 주소를 저장하려고합니다. 만약 내가 함수를 사용하여 데이터 형식을 사용하기 때문에 나는 INNODB 테이블에 인덱스를 만들 수 없습니다 그들을 암호화하는 것이 믿습니다. 테이블이 매우 커지면 선택하는 데 시간이 오래 걸릴 것입니다.mysql 데이터베이스에서 이메일을 암호화하는 방법은 있지만 여전히 쿼리 할 수 ​​있습니까?

이메일 주소를 안전하게 유지하면서도 빠르게 쿼리하고 열의 고유 한 값으로 보존 할 수있는 최상의 솔루션은 무엇입니까?

답변

9

사용자가 사이트에 등록하면 AES_ENCRYPT()를 사용하여 전자 메일을 암호화하십시오.

INSERT into users (email) VALUES (AES_ENCRYPT('[email protected]', 'aeskey')); 

당신이 당신의 데이터베이스를 조회 할 때, 당신은 AES_DECRYPT() 같은 함수를 호출 할 수 있습니다

SELECT AES_DECRYPT(email, 'aeskey') from users; 
+0

그래서 기본적으로 암호화를 사용하려면 전자 메일 주소 열을 고유 인덱스로 만들 수 없습니까? – bshack

+0

다른 사용자가 등록 할 때 동일한 이메일을 사용하려고 시도하지 않는 한 충돌하는 AES 암호화 값을 가져서는 안됩니다. 사용자가 등록 할 때 데이터베이스를 쿼리하여 전자 메일이 고유한지 확인할 수 있습니다. AES 암호화 및 MySQL에 대한 유용한 링크 : http://thinkdiff.net/mysql/encrypt-mysql-data-using-aes-techniques/ –

+0

텍스트 열 유형을 사용하려고합니다. UTF-8 그래서 괜찮을거야. 전체 서버가 손상된 경우 db가 아니라 해커가 암호화 키를 가져와 db의 전자 메일 주소를 해독 할 수 있습니다. – bshack

4

SHA-256 등으로 주소를 해시하는 경우에도 여전히 테이블의 색인을 생성 할 수 있으며 빠른 주소 조회를 수행 할 수 있습니다 (사용자가 [email protected]을 검색하면 입력을 해시 할뿐입니다). 테이블에서 일치하는 해시를 선택하십시오).

ssh은 해시 트릭 very similar을 사용합니다. 자세한 내용은 해당 맨 페이지의 -H 옵션을 찾으십시오.

+0

고유해야합니다 경우 말했다 나중에 필요할 경우 사용자에게 이메일을 보냅니다. – bshack

+0

@bshack, 데이터베이스에서 이메일 주소를 검색 할 수있는 기술을 사용하면 공격자가 데이터베이스 내용을 가져올 수 있습니다. 그 시점에서 유일한 보호는 @pcmantinker가 제안한 것처럼 응용 프로그램에 하드 코딩 된 핵심이 될 것이지만 데이터베이스 덤프를 자주받는 사람도 프로그램 바이너리를 얻을 수 있습니다. (항상 그런 것은 아니지만 코드에 포함 된 키에 의존하는 것은 매우 희박합니다 :) – sarnold

+1

빠른 검색을 위해 전자 메일 주소를 해싱 할 수 있으며 다른 열이나 테이블에 암호화 된 값이 있습니다. 별도의 테이블에 넣으므로 필요할 경우 다른 파티션에 넣을 수 있습니다. –

0

AES_DECRYPT (이메일 '의 비밀')와 AES_ENCRYPT (이메일을 '의 비밀')는 최적 솔루션,

내가 암호화하지만 이론 후 독특한 beeing는 약 100 % 확실하지 않다 이메일 고유 encription은 내가 할 수없는이 방법을 취소 암호화 이메일 주소 및 사용을 할 경우 내가 생각

+0

AES 암호화 된 데이터를 innodb 열 인덱스를 가질 수있는 열 유형에 저장할 수 있습니까? – bshack

관련 문제