2015-05-27 24 views
5

Tôi có mã sau đây hoạt động tốt trên PHP 5.5.9.mcrypt_encrypt không hoạt động đúng trên PHP 5.6.9

function index() 
{ 
    echo $this->encryptText_3des('TEST','JHHKJH9879'); 
} 

function encryptText_3des($plainText, $key) { 
    $key = hash("md5", $key, TRUE); 
    for ($x=0;$x<8;$x++) { 
     $key = $key.substr($key, $x, 1); 
    } 
    $padded = $this->pkcs5_pad($plainText, 
    mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC)); 
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC)); 
    return $encrypted; 
} 

function pkcs5_pad ($text, $blocksize) 
{ 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 

Các mã hóa đã xảy ra fine.But trong 5.6.9 thì trong doc PHP của mcrypt_encrypt, họ đề cập rằng

khoá không hợp lệ và iv kích thước không còn được chấp nhận. mcrypt_encrypt() bây giờ sẽ ném một cảnh báo và trả về FALSE nếu các đầu vào không hợp lệ. Các khóa và IV trước đây được đệm bằng các byte '\ 0' tới kích thước hợp lệ tiếp theo.

Làm cách nào để sửa đổi mã hiện tại của tôi bằng tham số thứ năm mà không thay đổi thuật toán mã hóa?

tôi đã cố gắng

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

và trao $ iv như tham số thứ năm.

Nhưng nó không hoạt động. Mã hóa khác với mã hóa trước đó.

Trả lời

2

Tìm thấy câu trả lời trong trường hợp bất cứ ai cần

$ivSize = 8; 
$iv = str_repeat("\0", $ivSize); 

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC, $iv)); 

Vượt qua một tham số 5 bằng tay mà phiên bản trước đó đang làm ngày của riêng mình!

4

Không mô phỏng các phiên bản PHP cũ có hành vi yếu để khởi tạo IV.

Sử dụng mcrypt_create_iv().

Họ đã xóa iv tự động 0 byte cho một lý do lý do.

+0

Trong khi tôi đồng ý rằng một IV ngẫu nhiên nên được sử dụng, nó có thể không áp dụng đối với trường hợp Ops, bởi vì họ đã có một thư viện đầy đủ các bản mã phải tương thích. –

+0

@ArtjomB. điểm tốt, để đảm bảo giải mã các bản mã "kế thừa", phải sử dụng iv "cũ" .. – DanFromGermany

+1

Đảm bảo bạn cũng sử dụng 'MCRYPT_DEV_URANDOM'! –

0

Tôi khuyên bạn không nên phát minh lại bánh xe vì chức năng của bạn có nhiều lỗi kỹ thuật mã hóa.

  • Không sử dụng 3DES, sử dụng AES. Hằng số mcrypt chính xác cho AES là MCRYPT_RIJNDAEL_128, bất kể kích thước khóa mong muốn của bạn là bao nhiêu. Mcrypt is pretty terrible.
  • Không sử dụng md5() làm chức năng dẫn xuất khóa. Nếu bạn thấy mình cần một KDF (ví dụ: vì bạn đang sử dụng mật khẩu thay vì lưu trữ khóa mã hóa), hãy sử dụng hash_pbkdf2() với SHA-256.
  • Bạn đang mã hóa nhưng không xác thực bản mã của bạn. Secret-key encryption without message authentication is NOT secure in any language! Mã hóa-Sau đó-MAC xin vui lòng.

Nếu bạn đang đi để sử dụng Mcrypt (khuyến nghị của chúng tôi cho secure data encryption in PHP đang sử dụng libsodium nếu bạn có thể, nếu không defuse/php-encryption, nếu không openssl), hãy chắc chắn bạn vượt qua hằng số đúng để mcrypt_create_iv().

Bad:

$iv = mcrypt_create_iv(16, MCRYPT_RAND); // BAD EXAMPLE 

Tốt:

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); // YES! 
Các vấn đề liên quan