2009-10-11 7 views
6

thể trùng lặp:
Secure random number generation in PHPLàm thế nào để bạn tạo ra các số ngẫu nhiên an toàn mã hóa bằng PHP?

Chúng tôi cần phải tạo ra một chuỗi mã hóa ngẫu nhiên để sử dụng như một thẻ xác thực, đây sẽ được gắn với dữ liệu phiên trong cơ sở dữ liệu. Chúng tôi đang sử dụng PHP, có vẻ như không có trình tạo số ngẫu nhiên thích hợp tích hợp sẵn. Làm thế nào chúng ta có thể tạo ra một chuỗi ký tự ngẫu nhiên an toàn với độ dài N bằng cách sử dụng php?

Cũng lưu ý, do tính chất của ứng dụng của chúng tôi, shell_exec bị tắt khỏi bảng.

+0

Tìm câu trả lời của bạn ở đây: http://stackoverflow.com/questions/1182584/secure-random-number-generation-in-php –

Trả lời

-6

còn khoảng uniqid? tài liệu có một ví dụ về cách nó có thể được sử dụng cho cookie/phiên.

+0

Điều này dường như là cách tiếp cận tốt nhất - khi kết hợp với mt_rand như mô tả trong thủ công. – Travis

+7

uniqid không an toàn về mặt mã hóa, nó được thiết kế đặc biệt để không bao giờ trả về cùng một số hai lần, vì nó dựa trên đồng hồ hệ thống, tuy nhiên nó có entropy khá thấp nếu chỉ có kẻ tấn công biết xấp xỉ khi nó được tạo ra. – aaaaaaaaaaaa

+0

@ doanh nghiệp: OP không thực sự cần chức năng bảo mật mã hóa. và 'uniqid' là hoàn hảo cho trường hợp của anh ta. – SilentGhost

-4

Tắt đầu của tôi: lấy thời gian vi mô, nhân với microtime% 100 và thực hiện một số ít tiền trên sha1 kết quả nhận được.

+5

Điều đó sẽ không an toàn lắm. Không sử dụng đồng hồ hệ thống trừ khi bạn muốn đầu ra có thể dự đoán được. –

+0

Dan là đúng. Trường hợp an ninh là quan trọng, hạt giống dựa trên thời gian hiện tại không cung cấp đủ entropy. – christophe

4

Tùy thuộc vào nền tảng của bạn, bạn có thể sử dụng/dev/urandom hoặc CAPICOM. Đây là độc đáo tóm tắt trong this comment from Mark Seecof:

"Nếu bạn cần một số bit giả ngẫu nhiên đối với an ninh hoặc các mục đích mã hóa (trứng, IV ngẫu nhiên cho mã khối, muối ngẫu nhiên cho hash mật khẩu) mt_rand() là một nguồn nghèo Trên hầu hết các. nền tảng Unix/Linux và/hoặc MS-Windows, bạn có thể nhận được một lớp tốt hơn của các bit giả ngẫu nhiên từ hệ điều hành hoặc hệ thống thư viện, như thế này:

<?php 
// get 128 pseudorandom bits in a string of 16 bytes 

$pr_bits = ''; 

// Unix/Linux platform? 
$fp = @fopen('/dev/urandom','rb'); 
if ($fp !== FALSE) { 
    $pr_bits .= @fread($fp,16); 
    @fclose($fp); 
} 

// MS-Windows platform? 
if (@class_exists('COM')) { 
    // http://msdn.microsoft.com/en-us/library/aa388176(VS.85).aspx 
    try { 
     $CAPI_Util = new COM('CAPICOM.Utilities.1'); 
     $pr_bits .= $CAPI_Util->GetRandom(16,0); 

     // if we ask for binary data PHP munges it, so we 
     // request base64 return value. We squeeze out the 
     // redundancy and useless ==CRLF by hashing... 
     if ($pr_bits) { $pr_bits = md5($pr_bits,TRUE); } 
    } catch (Exception $ex) { 
     // echo 'Exception: ' . $ex->getMessage(); 
    } 
} 

if (strlen($pr_bits) < 16) { 
    // do something to warn system owner that 
    // pseudorandom generator is missing 
} 
?> 

NB: nó nói chung là an toàn để rời cả nỗ lực để đọc/dev/urandom và nỗ lực truy cập CAPICOM trong mã của bạn, mặc dù mỗi người sẽ thất bại âm thầm trên nền tảng của người khác. Hãy để cả hai ở đó để mã của bạn sẽ di động hơn. "

+0

Cảm ơn - Tôi tin rằng đây là cách tốt nhất, vì/dev/urandom sử dụng nhiều nguồn entropy khác nhau, chứ không chỉ là đồng hồ hệ thống. Trong trường hợp của tôi, tuy nhiên, chúng tôi sẽ không thể sử dụng fopen theo cách này bởi vì chúng tôi về cơ bản làm việc trong một môi trường sandboxed. – Travis

+1

CẬP NHẬT: Từ [Windows Nền tảng SDK Phân phối lại: CAPICOM] (http://www.microsoft.com/en-us/download/details.aspx?id=25281) - "CAPICOM bị loại trừ khỏi SDK Windows bắt đầu bằng Windows SDK dành cho Windows 7 và mặc dù phân phối sẽ chạy trên các phiên bản 32 bit của hệ điều hành Windows 7 và Windows Server 2008 R2, việc sử dụng nó không được khuyến nghị. Để biết thêm thông tin, xem [Giải pháp thay thế để sử dụng CAPICOM] (http: // msdn.microsoft.com/en-us/library/windows/desktop/cc778518%28v=vs.85%29.aspx) " – Herbert