2017-10-23 21 views
-2

나는 내 데이터베이스mysqli_connect()가 암호화되지 않은 암호 매개 변수를 받아야하는 이유는 무엇입니까?

CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'my_pass'; 
GRANT ALL PRIVILEGES ON * . * TO 'my_user'@'localhost'; 
FLUSH PRIVILEGES; 

패스가 mysql 데이터베이스에서 user 테이블에서 암호화 모드에 저장을 사용하는 사용자를 만들었습니다.

그러나 mysqli_connect() 메서드를 사용할 때 매개 변수로 전달할 때 해당 매개 변수를 가져오고 싶지 않으면 쿼리에 사용한 암호화되지 않은 원래 값을 제공해야합니다. 유명한 "Connect failed : 사용자 'my_user'@ 'localhost'(암호 사용 : YES)에 대한 액세스가 거부되었습니다."

하지만 실제로 데이터베이스 (암호화 된 버전)에 저장된 것과 다른 문자열 값입니다.

어때요? 누군가가 연결을 설정 한 .PHP 파일에 액세스 할 경우 암호화 된 버전을 매개 변수로 제공하는 것이 더 안전하지 않습니까? mysqli_connection이 그것을 받아들이지 않는 이유는 무엇입니까? 그것을 할 수있는 방법이 있습니까?

+1

stackoverflow 또는 다른 사이트에 로그인 할 때 - 평범한 텍스트를 passowrd로 지정하지만 해시에 저장됩니다. 그 (것)들을 붙들 ndb이 타협 된 경우에 해시된다. – nogad

+1

왜 더 안전할까요? PHP 파일 – JimL

+1

에있는 암호로 로그인 할 수 있습니다. 암호화 된 암호가 일반 암호와 마찬가지로 사용될 수 있다면 요점은 무엇입니까? 상상의 mysqli_connect가 암호화 된 패스워드를 받아들이면, PHP 파일을 들여다 본 다음 패스워드를 가져 와서 데이터베이스에 연결하면된다.무엇이 주어 집니까? –

답변

1

사용자는 비밀번호가 암호화되는 방식을 알지 못합니다 (실제로 암호화되지는 않지만 해시 됨).

암호 만 전달하면 MySQL은 원래 암호와 동일한 해싱을 수행하고 저장된 암호와 비교할 수 있습니다. 해시 버전을 전달하면 해시의 모든 이점이 없어집니다. 누군가 서버에서 해시를 가져 오면 일반 암호처럼 로그인 할 수 있습니다. 그러면 해시가 암호가됩니다.

추가 된 이점은 원래 암호를 가지고 있기 때문에 더 나은 알고리즘으로 다시 해시하고 약간의 소금을 추가하고 그 향상된 버전을 저장할 수 있다는 것입니다. 결코 원본을 얻지 못하면 그 일은 할 수 없습니다. PHP's password functions도이 기능을 지원합니다. 해시 된 암호가 여전히 해시 된 경우 password_needs_rehash으로 확인하고 그렇지 않은 경우 데이터베이스를 업데이트 할 수 있습니다.

보안을 위해 다른 조치를 취해야합니다. 최소한 :

  • 암호는 문서 루트 외부에있는 포함 파일에 저장하십시오. 그렇게하면 아무도 그 파일을 직접 열 수 없습니다.
  • include 파일을 포함하지 않고 열 수 없도록 설정할 수 있습니다 (예 : index.php에 설정된 정의를 확인). 좋았지 만 구성 오류로 인해 PHP가 실패하면 사람들은 파일 소스를 탐색 할 수 있으므로 이전 규칙을 따르십시오.
  • 항상 특별한 데이터베이스 사용자를 만드십시오. root을 사용하지 마십시오. 이 사용자에게 데이터베이스를 조작 할 수있는 충분한 권한을 주되, 더 이상 권한을 부여하지 마십시오. 예를 들어 테이블을 삭제할 권한이 없습니다.
  • 항상 해당 사용자에게 고유 한 비밀번호를 제공하십시오. 이 암호는 기억할 필요가 없습니다. 충분히 많은 문자를 가진 무작위 쓰레기를 생성하십시오.
  • 암호를 정기적으로 변경하십시오. 어쩌면 스크립트를 작성하고 업데이트 된 암호를 config에 저장할 수도 있습니다.
+0

나는 내가 초보자 인 것 같아요. 나는 이런 것들을 아직 만드는 법을 모릅니다. 예를 들어, 첫 번째 암호 (루트 외부의 파일에 암호를 저장 한 다음 포함시킵니다). 그러나 나는 그것을 염두에두고 그것에 대해 배울 것입니다. 유용한 정보를 제공해 주셔서 감사합니다. – FranP

+1

첫 번째 것은 비교적 간단합니다. 예를 들어, domain/index.php를 검색 할 때'/ var/www/public-html/index.php'를 사용합니다. 즉'/ var/www/public-html '은 무엇의'root ' 공개적으로 볼 수 있습니다. 'index.php'는'/ var/www/config.php ''또는'include'../config.php'를 포함 할 수 있습니다. 이 파일은 (공개) 루트에서 한 레벨 위로 올라와있어 사람들이 탐색 할 수 없습니다. 그러나 어쨌든, 그것은이 Q & A를 제외하고 조금 있습니다. 더 나은 출처를 찾을 수있을 것이라고 확신하지만, 나는 당신을 올바른 길로 인도하기를 바랍니다. – GolezTrol

+0

당연히 @GolezTrol, 그것은 저를 위해 아주 hepful이고 맞은 방법에 저를 둔다! 백만 감사! – FranP