2016-11-28 1 views
1

새로운 PHP 작업에 대한 작업이 있지만 문제를 해결할 수 있는지 이해할 수 없습니다. 작업 : 그래서해시 된 전화 번호를 저장하여 이메일로 보내야합니까?

You need to create PHP web page that implements functional on picture below. Data must be stored in SQL. Hacker can not see user phone numbers and emails even if he got access to database or files. The solutions must contain standart PHP libs.

, 어떤 알고리즘 나는 문제를 해결하기 위해 사용해야합니까? password_hash() 기능을 사용하여 이메일을 저장할 수 있으며 이메일에서 전화 번호를 검색해야 할 때 password_verify()을 사용하여 이메일이 있는지 확인합니다. 전화 번호를 가지고 어떻게해야하는지, 내가 순수하고 무섭지 않게 보내야한다면?

enter image description here

+4

해싱은 단방향으로, 역방향으로 해독해야한다면 암호화를 살펴야한다. 예 : ['mcrypt'] (http://php.net/manual/en/function.mcrypt-encrypt.php) –

+0

해커가 데이터베이스를 얻는다면이 솔루션은 작업을 만족시킬 것입니까? – sirjay

+3

@mistermartin 새로운 개발을 위해 mcrypt를 권장하지 마십시오.mcrypt는 2007 년 이래로 유지 보수되지 않고 여러 가지 보안 상 중요한 버그를 포함하고 있으며 [PHP 7.1에서 더 이상 지원되지 않을 예정입니다] (https://wiki.php.net/rfc/mcrypt-viking-funeral). – duskwuff

답변

3

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을 사용할 수도 있습니다. 그런 다음 예를 들어 INSERTSELECT 검색어의 경우 SHA2('email', 256)입니다 (예 : INSERT INTO records VALUES (SHA2('[email protected]', 256), 'TheEncryptedTelNo');SELECT * FROM records WHERE email = SHA2('[email protected]', 256);). (평문 데이터가 로그에 저장되는 것에주의를 기울여야한다. 예를 들어, 이것을하기 전에 MySQL 설정을 알아야한다.)

+0

감사합니다. 사용자가 전화 번호를 보내려고 할 때 데이터베이스에 전자 메일이 있는지 확인하는 가장 좋은 방법은 무엇입니까? 이메일은 db로 해시됩니다. 그래서, 모든 해시 된 전자 메일과'for (...) {...} '주기가'password_verify()'에 의해 비교됩니까? 아니면 빠른 방법이 있습니까? – sirjay

+0

전자 메일은 데이터베이스에 해시로 저장됩니다. 그렇습니까? 요청에서 사용자가 입력 한 전자 메일을 다시 해시 한 다음 일치하는 전자 메일 해시가있는 항목에 대해 SQL 쿼리를 수행하면됩니다. 나는 전체'password_hash'에 대한 필요성을 정말로 보지 못합니다. 여기서'password_verify' 홉. 나는 약간의 소금을 던져서 이메일을 보내기 위해'sha1()'해쉬를 던지기 만하면된다. 이것을 참조 용 데이터베이스에 저장한다. 물론 이것이 실제로 보안을 극대화하는 운동이라면, 먼 길을 가야합니다. 그러나 CIA 요원의 전화 번호 나 다른 것을 저장하지 않는 한, 귀하의 케이스가 어떻게 요구되는지는 알 수 없습니다. –

+0

일반적인 사용 사례에서 사용자는 사용자 이름 (일반)과 암호를 입력 한 다음 사용자 이름과 일치하는 암호 해시를 데이터베이스에서 가져와 확인합니다. 이 경우 전자 메일은 유일한 참조 지점으로 사용됩니다. 'password_hash()'는 매번 고유 한 문자열을 반환하기 때문에 사용하고자한다면 각 요청에 대해 전체 데이터베이스를 비교하는 유일한 방법이다. 정말 훌륭하게 확장되지 않습니다. 다른 접근법에 대해서는 MySQL의 해시 및 암호화 기능을 살펴볼 수 있습니다. https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html –

관련 문제