2009-11-17 3 views
27

나는 암호를 암호화하기 위해 sha256을 사용하고 있습니다. mysql에 sha256 암호화 된 비밀번호를 저장할 수 있습니다. 하지만 같은 절로 로그인 할 수는 없습니다.php5.3.0에서 sha256을 사용하는 방법

삽입 코드 :

<?php 
error_reporting(E_ALL^E_NOTICE); 
$username = $_POST['uusername']; 
$passcode = $_POST['ppasscode']; 
$userflag = $_POST['uuserflag']; 
//$passcodeen = hash('sha256',$passcode); 
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode)); 
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error()); 
mysql_select_db("sessiondb"); 
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')"; 

선택 코드 : 뭔가 잘못

<?php 
error_reporting(E_ALL^E_NOTICE); 

    @mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error()); 
    @mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error()); 
    //get user input 
    $username = $_POST['username']; 
    $ppasscode = $_POST['ppasscode']; 
    //$passcodeen = hash('sha256', $ppasscode); 
    $passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode)); 
    //get session value from mysql 
    $query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error()); 

있습니까? 나는 매우 혼란 스럽다. 감사.

+2

당신은 암호를 저장하는 VARCHAR 필드를 사용하고 있습니까? 으로 VARCHAR의 최대 크기는 255 자입니다 때문에 ... – davethegr8

+0

당신은 코드에서 모양을 비교 데이터베이스에 저장된 그와 같은 해시의 샘플을 게시 할 수 있습니까? –

+1

sha256의 경우 최소 64 자의 VARCHAR가 필요합니다. davethegr8 @ –

답변

40

오타가 될 수 있습니까?

$_POST['ppasscode']; 

가 확실 할 것 (? 두시는 ppasscode에서 의도)와 수행

print_r($_POST); 

을하고 데이터가 정확한지 확인한 다음이 어떻게 보일지 알아 에코 :

echo hash('sha256', $_POST['ppasscode']); 

이 출력을 데이터베이스에있는 것과 수동으로 비교하십시오. 이렇게하면 실패하여 가능한 지점 탐색하고 있습니다 :

  1. 암호를 두의
  2. 저장된 비밀번호
  3. 비교를 해시 형태
  4. 에서 암호를 얻기.
+0

@ jeremy, 감사합니다. 예, 'ppasscode'가 사용되었습니다. –

+0

소금 사용 방법은? – mofidul

11

우선 sha256은 해싱 알고리즘이며 암호화 유형이 아닙니다. 암호화를 사용하면 정보를 원래 값으로 되돌릴 수 있습니다 (충돌은 제쳐두고).

코드를 보면 올바른 매개 변수를 제공하면 작동하는 것으로 보입니다.

  • 첫 번째 코드에서 리터럴 문자열을 사용하여 시도하고 사용의 유효성을 대신 검증 $_POST[] 변수

  • 주어진에 대한 해시 (코드에 데이터베이스 쿼리의 비교를 움직이고 시도 사용자가 방금 계산 한 해시와 비교하십시오)

하지만 가장 중요한 것은 공개 형식으로 배포하기 전에 입력 내용을 살균하십시오. 임의의 SQL을 쿼리에 삽입하지 마십시오. 여기서 가장 좋은 생각은 매개 변수가있는 쿼리를 사용하는 것입니다. 검사 할 때 또한,

https://github.com/ircmaxell/password_compat

하십시오, 그리고 :

+1

+1 입력 유효성 확인에 대한 조언. 매개 변수화 된 쿼리는 매우 적은 추가 코딩을위한 많은 제어 기능을 제공합니다. –

+0

@ Yannick, 좋은 조언을 주셔서 감사합니다. –

1

당신은 보안 암호

-1

더 나은 솔루션을 그냥 앤서니 페라라에서 excelent 호환성 스크립트를 사용하는 방법을 http://en.wikipedia.org/wiki/Bcrypt처럼 적응 해시를 사용한다 패스워드는 언제나 필요하다면 해쉬를 업데이트하기 위해 항상 길을 추가한다. (비동기식으로 타임밍 공격의 체크 프로세스에 영향을주지 않는다.)

관련 문제