2013-05-29 4 views
1

최근 세션과 MySQL이없는 테스트를 위해 Username과 Password 로그인을 사용하여 PHP 로그인 스크립트를 만들었습니다.PHP로 비밀번호를 안전하게 저장할 수 있습니까?

나는 사용자 이름은 다음 그래서

$fileuser[1] = "Bob"; // Password 123 
$fileuser[2] = "Tim"; // Password 321 
나는 inputtedd 암호를 얻기 위해 포스트를 사용

과 같은 배열에 같은 방법으로 저장되어있는이

$filepassword[1] = "123"; // User Bob 
$filepassword[2] = "321"; // User Tim 

같은 배열에 암호를 저장 for 루프에 넣고 패스워드가 배열에 하나라도 같다면 1을 반환 한 다음 숫자가 사용자 이름과 일치하는지 확인하고 일치하는지 확인합니다.

하지만 암호 나 PHP 파일의 해시를 저장해야합니까?

+2

암호를 직접 저장하지 말고 해시 만 저장하면됩니다. – Madsen

+0

암호는 해시되고 배열에 저장되지 않고 데이터베이스에 저장됩니다. –

+2

저장 위치는 중요하지 않습니다. 중요한 것은 * 어떻게 *. http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php – Jon

답변

10

왜 사용자 이름과 암호를 저장하기 위해 PHP 파일을 사용하겠습니까? 사용자 이름/비밀번호 검색을 위해 데이터베이스를 사용하는 것은 꽤 표준 적 (그리고 현재는 간단합니다)합니다.

즉, 당신은 을 입력하지 마십시오 암호를 데이터베이스에 일반 텍스트로 저장하려고합니다.

PHP 5.5에는 whole new set of password functions이 나오므로 이러한 기능의 호환을 위해 라이브러리를 사용하는 것이 어떻습니까? Password_compat.

핵심은 파일을 포함하고 기능을 사용하고 5.5가 나오면 포함을 제거하면 모든 기능이 코어의 일부이므로 여전히 작동합니다.

그것은 사용하기 정말 간단합니다

  • 해시 사용하여 암호를 password_hash()
  • 저장소 데이터베이스의 사용자 이름과 해시
  • 로그인 할 때, $ 보내 암호를 확인하기 위해 password_verify()를 사용 _POST를 데이터베이스의 해시와 비교합니다.

그게 전부 야! 간단하고 안전하며 앞으로 호환됩니다. 플랫 파일 스토리지보다 강력하게 권장됩니다.


당신은 정말 MySQL을 배울 수있는 시간이 소요됩니다. 그러나 구체적인 구현보다는 인터페이스에 코드를 작성하고 필요할 때마다 한 유형의 저장소를 다른 유형으로 전환하는 것이 좋습니다.

그렇다면 암호와 사용자 이름을 해시하고 필요한 경우 파일에 쓸 수 있습니다. 최소한 그들은 평범한 텍스트가 아니라 해시 될 것입니다. 위에서 설명한 기능을 계속 사용할 수 있습니다.

심지어 serialize() 배열을 작성하여 파일에 쓰고 다시 unserialize() 할 수 있습니다. 그러나 MySQL의 기본 사항을 배우려면 시간을 낭비 할 것을 권장합니다.

+0

그래서 사람들로부터 안전한 암호를 MySQL 데이터베이스에 저장해야합니다. 함수는 또한 내가 항상 듣는 SQL 인젝션을 멈추게 할 것인가, 아니면 새로운 기능에 대해 걱정할 필요가없는 것인가? –

+1

큰 질문입니다! ** 암호의 ** 해시를 데이터베이스에 저장합니다. 암호는 안전하지 않습니다. 다행히 ** ** ** ** 실제로 그렇게하고 싶다면 다행입니다. 이를 방지하기 위해 PDO (또는 MySQLi, 처음에는 더 간단 할 것입니다)와 [prepared statements] (http://en.wikipedia.org/wiki/Prepared_statement)를 사용합니다. 다시 말하지만, 인터넷을 통해 간단한 튜토리얼을 볼 수 있으며, 학습에 대한 의도와 함께 그들에게 들어가면 커다란 도움이 될 것입니다. PDO를 선택하면 ** [여기에 좋은 자습서가 있습니다.] (http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers) **. – Jimbo

+0

암호가 안전하도록 mysql (또는 다른 데이터베이스)이 필요하지 않습니다. 암호를 올바르게 해싱하는 것이 여기에 중요한 부분이며 암호가 저장되는 곳이 아닙니다. 서버의'passwords.txt' 파일에 해시를 저장할 수 있으며 적절한 파일 권한과 웹에 액세스 할 수 없습니다. 데이터베이스에있는 것만큼이나 안전합니다. –

2

그래, 아니오.

PHP는 서버 측 언어이므로 클라이언트를 통해 아무도 암호를 볼 수 없습니다.

BUT 1 : 해커가 서버에 액세스하면 암호가 저장 및 손상되지 않습니다. 2 : 실수가 만들어지고 PHP 파일을 PHP는 있지만 텍스트로 표시되지 않으므로 서버가 매우 안전한 것으로이어야를 해시하는 것이 좋습니다 것입니다 다시 그래서 의미로

을 손상, 텍스트로 PHP를으로 출력한다.

그런 다음 php 파일에 저장하는 것이 좋습니다. 그것은 몇 가지 문제가 있습니다. 1 : 사용하기가 쉽지 않습니다. 데이터베이스를 사용하면 멋진 검색을 할 수 있습니다. 2 : PHP에서 거대한 배열을로드 할 때 필요한 값은 1 개뿐입니다. 메모리 낭비

+0

암호를 해시하는 한 원격 공격으로부터 안전 할 수 있습니다. FTP 또는 내 PC에있는 사람들에 대해서만 걱정할 필요가 있습니까? (나는 이것을 테스트하기 위해 로컬 호스트 웹 사이트를 운영하고있다.) –

+0

당신이 해시하는 한 안전하게 할 수있다. (우리는 좋은 해킹 방법, 나는 bcrypt를 사용한다). – MKroeders

+0

나는 이런 것들로 시작하고있다. 그래서 나는이 모든 방법을 시도 할 것이다. –

-5

가장 안전한 옵션은 md5() 함수를 사용하는 것입니다. $ fileuser [1] = md5 ($ fileuser [1]); 등 ...

모든 것을 md5로 변환 한 다음 변환 된 문자열을 서로 비교하여 동일성 또는 불평등을 비교할 수 있습니다.

희망이 있습니다.

+2

어떻게 md5()가 안전하다고 주장 할 수 있습니까? wdr.()가 안전하다고 생각할 수 있습니다. 보안 및 해시 – Madsen

+5

번호 ** ** MD5를 사용하지 마십시오. 무차별 공격에 폭넓게 열려 있습니다. "왜 md5가 안전하지 않은지"또는 안전하지 않은지, 아니면 그 라인을 따라 무엇인가에 대해 간단한 google을 수행하십시오. 숫자는 기억이 나지 않지만, 강력한 GPU를 사용하면 몇 분 안에 MD5의 해시를 해독 할 수 있습니다. – Jimbo

+0

@Jimbo와 동의합니다. [여기] (http://www.wired.co.uk/news/archive/2013-05/28/password-cracking)는 방금 읽은 번호가있는 좋은 기사입니다. – juanreyesv

0

적은 수의 암호의 경우 파일에 저장하는 것이 완벽하게 가능합니다. 정성 들여 배열 형식을 선택해야합니다. 당신의 형식은 ... 상당히 차선입니다. 앞서 말했듯이 비밀번호를 일반 텍스트로 저장하지 마십시오.

passwords.php

<?php 

return array(
    'Bob' => '$2y$10$lwnevwevweuvuev...', // hash of Bob's password 
    ... 
); 

만큼 당신이 암호를 저장으로 login.php

<?php 

// include https://github.com/ircmaxell/password_compat functions 
require_once 'lib/password.php'; 

$passwords = require 'passwords.php'; 

if (isset($_POST['username'], $_POST['password'])) { 
    if (!isset($passwords[$_POST['username']])) { 
     die('Invalid username'); 
    } 
    if (!password_verify($_POST['password'], $passwords[$_POST['username']])) { 
     die('Invalid password'); 
    } 
    echo 'Hi there!'; 
} 

제대로 있는 파일에 저장, 강력한 알고리즘을 사용하여를 해시 거의 데이터베이스를 사용하는 것보다 더 안전하지 않습니다. PHP 파일의 내용을 우연히 드러내지 않도록 조심해야한다. 잘못 배치 된 var_debug($passwords) 또는 잘못 구성된 웹 서버로 인해 암호 해시가 공개적으로 표시 될 수 있습니다. 이 경우 그들은 여전히 ​​해시되었지만 여전히 비밀로 유지하는 것이 좋습니다. https://github.com/ircmaxell/password_compat과 같이 검증되고 사용자에게 친숙한 해싱 라이브러리를 사용하십시오.

+0

나는 사용자 이름과 암호를 확인하기위한 내 설정이 다소 미친 점에 동의합니다. 그런 식으로 생각한 적이 없었습니다. 로그인 스크립트를 만드는 것 외에 다른 계획을 처음 생각한 것 같습니다. –

관련 문제