2013-04-08 41 views
14

Tôi cần hai hàm/phương thức, một hàm để mã hóa, một để giải mã. Đây không phải để lưu trữ mật khẩu. Mỗi người dùng sẽ có một khóa/muối cụ thể để mã hóa dữ liệu.Cách tạo phương thức mã hóa/giải mã hai chiều bằng cách sử dụng khóa cụ thể sử dụng - PHP?

Đây là cách tôi muốn nó hoạt động:

function encode($str, $key) { 
    // something fancy 
} 

function decode($str, $key) { 
    // something fancy 
} 

$key = $logged_in_user->get_key(); 
$plain = 'abc abc 123 123'; 
$encoded_data = encode($plain, $key); 
// some_fancy_encrypted_data_that_is_really_cooooool 
$decoded_data = decode($encoded_data, $key); 
// abc abc 123 123 

Một điều nữa là mỗi khi tôi sử dụng chức năng này nó cần phải trả lại điều tương tự mỗi khi tôi sử dụng encode chức năng với phím cùng một người dùng .

Tôi làm như thế nào?

+4

Vì vậy, bạn đã xem mcrypt (http://www.php.net/manual/en/mcrypt.examples.php) chưa? Và thả thẻ 'hash', bởi vì bạn nói bạn __don't__ muốn có một băm –

+0

Tôi có một [lớp nhỏ] (http://stackoverflow.com/questions/15034368/cannot-decrypt-openssl-encrypt-output-on -nguyên tuyến) có thể làm những gì bạn cần, nhưng câu hỏi thực sự là lý do tại sao bạn cảm thấy cần phải mã hóa riêng từng dữ liệu của người dùng một cách độc lập. Nó thường được giả định rằng một khi một cuộc tấn công có thể nhìn thấy dữ liệu được lưu trữ của bạn, họ cũng có thể thấy mã nguồn của bạn làm mất hiệu lực sử dụng hầu hết các mã hóa nội bộ, cũng như có ý định như họ có thể. – Sammitch

+0

@Sammitch Trong một số trường hợp, nó hữu ích nếu khóa được sử dụng để mã hóa/giải mã dữ liệu không thể tìm thấy ở bất cứ đâu (và chỉ thuộc về người dùng). Tôi khá chắc chắn rằng LastPass làm điều này là tốt. – h2ooooooo

Trả lời

46
$myVarIWantToEncodeAndDecode 

Xác định chủ chốt (muối, nước luộc vv ..): $key = "#&$sdfdfs789fs7d";

Để mã hóa:

$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $myVarIWantToEncodeAndDecode, MCRYPT_MODE_CBC, md5(md5($key)))); 

Để giải mã:

$decoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encoded), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); 

Lưu ý: mcrypt_decrypt đã bị phản đối như của PHP 7.1.0. Dựa vào chức năng này là rất nản lòng.

+0

hmm .. Điều này dường như hoạt động, nhưng dữ liệu tôi nhận được từ giải mã chuỗi là 'A' · fµŒ '÷ Óÿ ‰ Zvÿ “õE ¥ ‰ ¬DõØ & Hå§'. Chuyện gì vậy? –

+0

Vì vậy, nó giải mã và mã hóa phải không? Bạn đang mã hóa cái gì? văn bản thô? dữ liệu được mã hóa nên giống như thế này: 'VXHE0iM0bMXQecCAKYAzYZjy4gbctqLGQHYvW2cFhaE =' – rinchik

+0

http://phpfiddle.org/lite/code/zj5-ic6 – rinchik

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