2014-06-24 26 views
6

tôi đang cố gắng để xác thực người dùng bằng cách sử dụng phương pháp Auth::attempt() và nó tiếp tục thất bại, vì vậy tôi cuối cùng đã kết thúc với đoạn mã sau:Laravel 4 - Băm cùng một mật khẩu cho các giá trị khác nhau

$arr = array(); 
$arr['verified'] = Hash::make('1234') . ' ; ' . Hash::make('1234'); 
return json_encode($arr); 

và đây là kết quả :

{"verified":"$2y$10$V4yXBUcxealfLrzOE\/xAD.sJ8qpNhrMA6K6dENBBXYqaVx1zSETgy ; $2y$10$C9xpOWLTUyfy1KL.Y3Tot.KWADmQYFK\/HAf6uZGGXTKcVh52qHS4m"} 

Như bạn có thể thấy, băm đầu tiên mang đến cho $2y$10$V4yXBUcxealfLrzOE\/xAD.sJ8qpNhrMA6K6dENBBXYqaVx1zSETgy và băm thứ hai mang đến cho $2y$10$C9xpOWLTUyfy1KL.Y3Tot.KWADmQYFK\/HAf6uZGGXTKcVh52qHS4m

T anh ta không có gì để làm với cơ sở dữ liệu mặc dù khi lưu trữ, tôi có một trường mật khẩu 60 ký tự.

Bất kỳ ý tưởng nào?

Trả lời

25

Điều này hoàn toàn ổn và cách thức hoạt động của nó. Laravel sử dụng Bcrypt cho Hashing và do đó tạo ra một muối ngẫu nhiên trong quá trình băm. Muối sẽ là một phần của Hash, đó là lý do tại sao bạn nhận được hai kết quả khác nhau.

Thuật toán veryfing sẽ tự động xem xét muối. Phương pháp này làm cho việc sử dụng các bảng cầu vồng gần như không thể.

Nó không phải là một lỗi, nó bảo mật thêm mà không cần nỗ lực.

Với ví dụ của bạn veryfing chống lại cả hai băm của bạn sẽ trở thành sự thật:

<?php 

$hash1 = Hash::make('1234'); // A hash is generated 
$hash2 = Hash::make('1234'); // Another hash is generated that differs from the first one 

var_dump(Hash::check('1234', $hash1) && Hash::check('1234', $hash2)); 

Mặc dù $hash1$hash2 chứa băm khác nhau, veryfing chống lại họ với chuỗi cơ sở nhất định sẽ đánh giá là true.

Băm được tạo có độ dài 60 ký tự. Vì vậy, cần đảm bảo rằng cột nơi băm được lưu trữ cũng có kích thước tối thiểu là 60 ký tự

+0

Nhưng tôi cần lưu trữ mật khẩu băm trong cơ sở dữ liệu, làm cách nào để so sánh với mật khẩu đó? vì mật khẩu sẽ không phải lúc nào cũng là '1234'. Và làm thế nào tôi có thể sử dụng phương pháp này với phương thức 'Auth :: try()'? –

+1

@ user3723418 - Muối ngẫu nhiên sẽ trở thành một phần của giá trị băm kết quả, muối này được trích xuất từ ​​giá trị băm được lưu trữ để xác minh mật khẩu đã nhập, chỉ cần sử dụng 'Hash :: check()' nó sẽ tự động cho bạn. – martinstoeckli

+1

@ user3723418 sử dụng phương thức Auth :: try() thậm chí còn dễ dàng hơn. Ngay sau khi bạn có muối băm trong cơ sở dữ liệu của bạn (đúng thiết kế db giả định) laravel sẽ tự động kiểm tra đầu vào dựa vào các trường trong cơ sở dữ liệu của bạn. Nếu có một trường mật khẩu trong db và một khóa mật khẩu trong mảng của bạn, bạn chuyển sang phương thức 'Auth :: try()' laravel sẽ tự động kiểm tra lại hai giá trị này để xem xét băm và sau đó thực hiện xử lý phiên. – thpl

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