PHP는 내장을 제공 solutions 데이터를 암호화하고 해독. 예 : MCrypt은 일반적인 알고리즘의 좋은 뷔페를 지원합니다. 정확한 보안 등급 인 cipher은 필요한 보안 수준에 따라 결정됩니다. 일반 그림은 Wikipedia on block ciphers입니다. 편집 : PHP 7.1에서 MCrypt가 deprecated이라는 것을 알았으므로 그 대신에 OpenSSL을 사용하는 것이 좋습니다.
해커가 시스템에 대한 완전한 액세스 권한을 얻더라도 전화 번호에 액세스 할 수 있어야하는 경우 해독 키가 분명히 서버 외부에 있어야합니다. DB 또는 파일 시스템에 저장할 수 없습니다.
스펙에 따르면이 키는 전화 번호와 일치하는 전자 메일 주소가됩니다. 그런 다음 입력 된 시간에 전자 메일을 단방향 해시하고 전화 번호를 암호화하기위한 키로 해시되지 않은 전자 메일을 사용합니다. 요청시 전자 메일 해시를 사용하여 일치하는 전화 번호를 찾은 다음 해를 끼지 않는 전자 메일을 키로 해독합니다. 당신을 분류해야합니다.
업데이트 : 당신이 (새로운 소금과 고유 한 문자열마다 발생) password_hash()
를 사용 한 경우, 데이터베이스의 전화/이메일 쌍을 일치하는 기록을 가져 오는, 당신의 유일한 옵션 모든 레코드를 가져와 password_verify()
을 통해 반복하는 것입니다. 그것은 특별히 확장 성이 없습니다.
보안 문제가 아니라면 전자 메일의 단순한 sha1()
해시 이상을 신경 쓰지 않을지 확신 할 수 없습니다. 또는 예 : crypt($email, '$2y$08$Some22CharsOfFixedSalt$');
- crypt() 참조 - 고정 소금 문자열을 사용하는 복어 기반 해시를 생성하여 불변 해시가 발생합니다. 또한 데이터베이스 항목에서 결과 문자열의 주요 소금 부분을 자릅니다.
교활한 느낌이라면 모든 전자 메일을 해시하는 데 같은 소금을 사용하는 대신 해싱 함수에서 소금에 사용하는 알고리즘을 익히는 것이 좋습니다.
데이터베이스에 대한 전자 메일 해싱을 위임하고 MySQL's encryption functions을 사용할 수도 있습니다. 그런 다음 예를 들어 INSERT
및 SELECT
검색어의 경우 SHA2('email', 256)
입니다 (예 : INSERT INTO records VALUES (SHA2('[email protected]', 256), 'TheEncryptedTelNo');
및 SELECT * FROM records WHERE email = SHA2('[email protected]', 256);
). (평문 데이터가 로그에 저장되는 것에주의를 기울여야한다. 예를 들어, 이것을하기 전에 MySQL 설정을 알아야한다.)
해싱은 단방향으로, 역방향으로 해독해야한다면 암호화를 살펴야한다. 예 : ['mcrypt'] (http://php.net/manual/en/function.mcrypt-encrypt.php) –
해커가 데이터베이스를 얻는다면이 솔루션은 작업을 만족시킬 것입니까? – sirjay
@mistermartin 새로운 개발을 위해 mcrypt를 권장하지 마십시오.mcrypt는 2007 년 이래로 유지 보수되지 않고 여러 가지 보안 상 중요한 버그를 포함하고 있으며 [PHP 7.1에서 더 이상 지원되지 않을 예정입니다] (https://wiki.php.net/rfc/mcrypt-viking-funeral). – duskwuff