2009-11-17 42 views
27

Tôi đang sử dụng sha256 để mã hóa mật khẩu. Tôi có thể lưu mật khẩu được mã hóa sha256 trong mysql. Nhưng tôi không thể đăng nhập với cùng một mệnh đề.Cách sử dụng sha256 trong php5.3.0

Chèn mã:

<?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')"; 

Chọn mã:

<?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()); 

Có điều gì sai? Tôi rất bối rối. Cảm ơn.

+2

Bạn đang sử dụng trường VARCHAR để lưu trữ mật khẩu? Bởi vì kích thước tối đa trên varchars là 255 ký tự ... – davethegr8

+0

Bạn có thể gửi một mẫu của băm như được lưu trữ trong cơ sở dữ liệu so với những gì nó trông giống như trong mã? –

+1

Đối với sha256, bạn cần VARCHAR có ít nhất 64 ký tự. –

Trả lời

40

Đây có phải là lỗi đánh máy không? (Hai Ps trong ppasscode, dự định?)

$_POST['ppasscode']; 

tôi sẽ đảm bảo và làm:

print_r($_POST); 

và chắc chắn rằng các dữ liệu chính xác ở đó, và sau đó echo ra những gì nó sẽ giống như thế:

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

So sánh đầu ra này với những gì bạn có trong cơ sở dữ liệu (thủ công). Bằng cách này bạn đang khám phá các điểm có thể bạn không hoạt động:

  1. Bắt mật khẩu từ hình thức
  2. băm mật khẩu
  3. lưu trữ mật khẩu
  4. so sánh hai.
+0

@jeremy, Cảm ơn, vâng, 'ppasscode' được dự định. –

+0

làm thế nào để sử dụng muối? – mofidul

11

Trước hết, sha256 là thuật toán băm, không phải là loại mã hóa. Một mã hóa sẽ yêu cầu phải có một cách để giải mã thông tin về giá trị ban đầu của nó (các va chạm sang một bên).

Nhìn vào mã của bạn, có vẻ như nó sẽ hoạt động nếu bạn đang cung cấp thông số chính xác.

  • Hãy thử sử dụng một chuỗi chữ trong mã của bạn đầu tiên, và xác minh tính hợp lệ của nó thay vì sử dụng $_POST[] biến

  • Hãy thử di chuyển so sánh từ các truy vấn cơ sở dữ liệu mã (được băm cho cho người dùng và so sánh với hàm băm bạn vừa mới tính)

Nhưng quan trọng nhất trước khi triển khai điều này dưới bất kỳ hình thức công khai nào, hãy nhớ vệ sinh đầu vào của bạn. Không cho phép SQL tùy ý chèn vào các truy vấn. Ý tưởng tốt nhất ở đây sẽ là sử dụng các truy vấn được tham số hóa.

+1

+1 để được tư vấn về xác thực đầu vào. Các truy vấn tham số cung cấp rất nhiều điều khiển cho rất ít mã hóa bổ sung. –

+0

@Yannick, Cảm ơn lời khuyên tốt của bạn. –

-1

Một cách giải pháp tốt hơn là chỉ cần sử dụng kịch bản tương thích xuất sắc từ Anthony Ferrara:

https://github.com/ircmaxell/password_compat

Xin vui lòng, và cũng có thể, khi kiểm tra mật khẩu, luôn luôn thêm một cách (tốt nhất là không đồng bộ, do đó, nó không ảnh hưởng đến quá trình kiểm tra cho các cuộc tấn công timming) để cập nhật băm nếu cần thiết.

Các vấn đề liên quan