2011-04-22 40 views
11

Tôi đang rối tung với một lược đồ ủy quyền đơn giản. Tôi nghĩ cách dễ nhất để thực hiện điều đó mà không cần SSL hoặc xác thực HTTP khác sẽ là mã hóa khóa được chia sẻ. Thích ứng với một ví dụ đơn giản từ hướng dẫn PHP, tôi đã đưa ra như sau:Gửi chuỗi mã hóa được mã hóa qua thông số URL - văn bản được giải mã bị cắt xén

$text = "boggles the invisible monkey will rule the world"; 
$key = "This is a very secret key"; 

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_ECB, $iv); 

$iv = base64_encode($iv); 
$enc = base64_encode($enc); 

echo '<a href="temp2.php?iv='.$iv.'&text='.$enc.'">link</a><br />'; 

Trang tiếp nhận yêu cầu này (temp2.php) trông như thế này:

$key = "This is a very secret key"; 

$iv = base64_decode($_GET["iv"]); 
$enc = base64_decode($_GET["text"]); 

$crypttext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv); 

echo "$crypttext<br>"; 

này được rất gần, nhưng nó không giải mã properly-- nó vang

boggles the invisible monkey will rule t—;eôügJë

tôi không chắc chắn những gì mà gác máy là, tôi đã cố gắng urlencode/urldecode và htmlentities, nghĩ có lẽ một char acter bị xáo trộn trong yêu cầu, nhưng không có sự khác biệt.

Tôi còn thiếu cái gì khác không? Có lẽ đệm?

Cảm ơn

+3

Chuỗi Base64 thường kết thúc bằng '=' char. Tôi đặt cược you'r mất một trong khi phân tích cú pháp URL (vì = là một cái gì đó của một char đặc biệt). Thử 'urlencode (base64_encode())'? –

+1

Plus, bạn nên đăng dữ liệu này, vì có giới hạn về kích thước của chuỗi nhận được (nó ở trên đó trong các máy chủ hiện đại, nhưng chúng tồn tại) – ircmaxell

+0

@Frank Farmer-- Tôi đã thử tuyến đường url/giải mã. Không giúp được gì. @ ircmaxwell-- bạn nói đúng, nhưng đây là một chuỗi khá nhỏ ban đầu. – julio

Trả lời

29

Nó xảy ra rằng văn bản được mã hóa của bạn sẽ kết thúc tìm kiếm một cái gì đó như:

Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7 

Thấy rằng dấu cộng đó? Dấu cộng trong URL được chuyển thành không gian.

Khi chuyển đổi thủ công dấu cộng đó sang không gian và giải mã kết quả, đầu ra là tệp rác bị hỏng mà bạn đã chứng kiến.

Bạn nên chạy cả IV và các văn bản được mã hóa thông qua rawurlencode (khôngurlencode) trước khi gắn bó nó vào liên kết. Điều này sẽ mã hóa đúng dấu cộng, mà sẽ bảo vệ nó thông qua quá trình này. Bạn không cần phải (và không nên) urldecode chuỗi ở phía bên kia - PHP sẽ làm điều này cho bạn.

+1

@Frank, nó xảy ra rằng việc thực hiện giải mã base64 của PHP bỏ qua các dấu hiệu thiếu hoặc bằng nhau ở cuối. Các triển khai khác có thể không quá tự do, do đó thực sự có thể là một vấn đề trong các trường hợp khác. – Charles

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