2013-01-15 46 views
5

Đây là lần đầu tiên tôi sử dụng hàm crypt() trong PHP, và tôi không thể hiểu tại sao nó không hoạt động. Mã của tôi dựa trên bài viết này: http://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274PHP crypt() Chức năng Blowfish Không hoạt động

function blowfishHash ($pw) { 
    //generate random salt 
    $salt = "$2y$10$"; 
    for ($i = 0; $i < 22; $i++) { 
     $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", mt_rand(0, 63), 1); 
    } 
    $hash = crypt($pw, $salt); 

    //printout to file 
    $file = fopen("debug.txt", "w+"); 
    fwrite($file, "\n\n\n".$pw); 
    fwrite($file, "\n\n\n".$salt); 
    fwrite($file, "\n\n\n".$hash); 
    fclose($file); 

    return $hash; 
} 

Tôi gọi hàm có mật khẩu mẫu "mật khẩu".

Muối kết quả là: $2y$10$NzRQNjTRfP4jXKvb4TCO.G
Nhưng mật khẩu là "$2mV0NZp92R3g" - dường như quá ngắn.

Ai đó có thể giúp tôi tìm ra những gì tôi đang làm sai?

+0

Tôi đã thử nghiệm ví dụ của bạn và nó xuất ra chính xác giống như trong bài viết. Làm thế nào để bạn đầu ra/gỡ lỗi $ mật khẩu. Trên một trang web? mỗi cli? – hek2mgl

+0

Tôi vừa in một tệp (tôi bỏ qua các dòng mã cho điều đó). Có một phiên bản PHP cụ thể cần thiết cho chức năng này không ...? – user1403777

+0

Bạn đang sử dụng phiên bản nào? (Tôi đang sử dụng: 5.3.10-1ubuntu3.4) – hek2mgl

Trả lời

2

Như bạn đã nêu trong nhận xét của mình, bạn đang sử dụng PHP 5.2.x.

Triển khai Blowfish chỉ khả dụng trong PHP> = 5.3.x. Nếu vì lý do nào đó không thể cài đặt phiên bản PHP mới hơn, bạn có thể kiểm tra here để biết thêm thông tin về cách làm cho Blowfish hoạt động với các phiên bản PHP cũ hơn.

+0

user1403777 điều này giải quyết vấn đề của bạn, không đáp ứng trong bất kỳ cách nào để trả lời không phải là đúng cách để cư xử trên stackoverflow ... –

1

crypt trong PHP 5.2 không hỗ trợ CRYPT_BLOWFISH, thay vào đó, mặc định là giải thích muối là muối kiểu CRYPT_DES. Lưu ý rằng đầu ra bắt đầu bằng "$ 2", là muối hai ký tự mà CRYPT_DES chọn từ đầu vào muối và được thêm vào băm và độ dài đầu ra khớp với độ dài đầu ra CRYPT_DES chính xác.

Điều thú vị là bạn có thể đạt được kết quả tương tự trong các phiên bản PHP sau này với hỗ trợ CRYPT_BLOWFISH bằng cách cắt ngắn muối thành hai ký tự. Tức là:

crypt('password', '$2y$10$NzRQNjTRfP4jXKvb4TCO.G') /* in PHP 5.2 */ 
== 
crypt('password', '$2') /* in PHP 5.4 */ 

Về lý thuyết, điều này có thể hữu ích cho khả năng tương thích ngược nếu muối kiểu CRYPT_BLOWFISH được sử dụng do lỗi trên PHP 5.2.

Điều này thực sự gây cho tôi một chút nhầm lẫn thời gian gần đây vì "$" nhân vật không phải là đầu vào muối có giá trị trong CRYPT_DES theo PHP crypt documentation, mà nói:

chuẩn DES dựa trên băm với một nhân vật hai muối từ bảng chữ cái "./0-9A-Za-z". Sử dụng các ký tự không hợp lệ trong muối sẽ khiến crypt() thất bại.

Nhưng ở đây ký tự "$" rõ ràng dường như được chấp nhận bởi crypt() trong cả v5.2 và v5.4.

Sẽ rõ ràng hơn và an toàn hơn nếu crypt thực sự trả về lỗi như tài liệu cho biết, thay vì chấp nhận "$" và mặc định là CRYPT_DES.

1

đây là chức năng mã hóa blowfish của tôi ....

<?php 
    function bcrypt($input, $salt=null, $rounds=12) { 
     if($rounds < 4 || $rounds > 31) $rounds = 12; 
     if(is_null($salt)) $salt = sprintf('$2a$%02d$', $rounds).substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22); 
     return crypt($input, $salt); 
    } 
    $hash = bcrypt('password'); 
    if($hash = bcrypt('password', $hash)) { 
     // password ok 
    } 

?> 
0

Ban đầu chỉ blowfish băm với muối bắt đầu với $2a$ được hỗ trợ.

$2x$$2y$ Chế độ Blowfish đã được thêm vào trong PHP 5.3.7 để xử lý các cuộc tấn công cao bit tiềm năng.

PHP 5.2.17 của bạn không hỗ trợ $2y$ chế độ Blowfish.

Lý do mã của bạn không hoạt động.

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