2008-11-29 42 views
7

Tôi đang xây dựng một hệ thống nguồn mà tôi đang đưa ra trên 'mạng để cung cấp vật nuôi ảo có thể chấp nhận. Hệ thống sẽ được sở hữu chủ yếu bởi trẻ em. Vì tôi muốn nó có thể sử dụng được cho các lập trình viên mới bắt đầu, có một số ràng buộc phức tạp trên hệ thống của tôi: Nó không thể sử dụng các thư viện không thường xuyên gửi bằng PHP và không thể chạm vào cơ sở dữ liệu hoặc ghi vào bộ nhớ vĩnh viễn khác .Mã hóa đơn giản trong PHP

Khi mỗi vật nuôi được chấp nhận, khách truy cập ngẫu nhiên sẽ nhận được một trong một loạt các biến thể hơi khác nhau của vật nuôi đó. Các biến thể ban đầu trông giống nhau, nhưng lớn lên theo thời gian để trở thành vật nuôi khác nhau. Khách truy cập sẽ được cung cấp một mã ngắn trong HTML liên kết đến hình ảnh thú cưng của họ. Vì không có bộ nhớ máy chủ lưu trữ vĩnh viễn, liên kết hình ảnh của người dùng phải chứa tất cả thông tin để xác định biến thể vật nuôi nào mà chúng đã kết thúc.

Hiện tại, URL chỉ chứa ID của thú cưng và ID của biến thể mà người dùng nhận được. Vấn đề với điều này là, bằng cách so sánh các mã với nhau, người dùng có thể tìm ra ai trong số họ đã kết thúc bằng cùng một biến thể. Vì một số biến thể hiếm hơn so với các biến thể khác, người dùng có thể phát hiện các biến thể hiếm hoi một cách dễ dàng trước khi sự khác biệt thậm chí còn hiển thị rõ ràng.

Điều tôi muốn là hệ thống mã hóa cho các chi tiết trong URL. Cái gì che khuất ID biến thể để mỗi người dùng nhận được một URL khác nhau có xác suất cao. Tôi đã nghĩ đến việc sử dụng ID biến thể (3 hoặc 4 bit) làm bit thấp hoặc bit cao của một số ngẫu nhiên lớn, nhưng người dùng sẽ phát hiện ra mẫu trong đó. Lý tưởng nhất là hệ thống mã hóa sẽ được parametrized để mỗi cài đặt của hệ thống của tôi sẽ sử dụng một mã hóa hơi khác nhau.

Thư viện mã hóa của PHP có lẽ sẽ có thứ gì đó hữu ích trong đó, nhưng dường như không phổ biến lắm trong số các chủ nhà.

Có mã hóa/mã hóa/mã hóa đơn giản, tham số, tôi có thể sử dụng ở đây không?

Trả lời

9

Nếu bạn đang mong đợi mức độ tinh vi tương đối thấp, thì bạn có thể thực hiện mã hóa "xor" rất đơn giản và "lưu trữ" khóa này làm một phần của URL. Sau đó, bạn chỉ có thể sử dụng rand() hoặc/dev/random của php hoặc bất kỳ thứ gì để tạo ra các khóa.

Người dùng tinh tế thấp sẽ không dễ dàng nhận ra rằng tất cả những gì họ cần làm là xor nửa dưới ID con vật cưng của họ với nửa trên để có được giá trị có thể so sánh với bạn bè của họ. Tôi đoán hầu hết mọi người sẽ có thể nhận ra đó là những gì đang diễn ra sẽ không dành thời gian để tìm ra, và những người đó ở bên ngoài khán giả mục tiêu của bạn.

Chỉnh sửa: Nếu nó không rõ ràng, tôi nói bạn đưa ra một chìa khóa khác nhau cho mỗi con vật cưng (vì cho cùng một con sẽ không giải quyết được vấn đề của bạn). Vì vậy, nếu biến thể vật nuôi (petvar) là số 16 bit, bạn tạo số ngẫu nhiên 16 bit (rnd), sau đó bạn thực hiện điều này: petvar = (petvar^rnd)<<16 | rnd; và sau đó bạn có thể đảo ngược hoạt động đó để trích xuất rnd và sau đó là petvar^rnd và sau đó chỉ cần xor nó một lần nữa để có được petvar gốc.

+0

Âm thanh như một chiến lược hay. Tôi cũng có thể XOR toàn bộ chuỗi với một khóa cài đặt cụ thể. Trực giác của bạn về mức độ tinh tế của "kẻ tấn công" là rất chính xác .. :) – thenickdude

2

Tại sao không chỉ cung cấp cho mỗi người dùng một ID dài, ngẫu nhiên và sau đó lưu trữ tất cả chi tiết về thú cưng của họ trên máy chủ? Thực hành tốt nhất là không lưu trữ bất kỳ thứ gì trong URL, được mã hóa hay không. Tất cả những gì bạn cần là ID phiên.

+0

Tất nhiên, đó là những gì tôi làm trên máy chủ của riêng tôi. Nhưng tôi muốn có một hệ thống mà trẻ em có thể sử dụng trên máy chủ của riêng mình để cho thú vật nuôi, ngay cả khi không có bộ nhớ phong nha: Cơ sở dữ liệu không phải lúc nào cũng có sẵn trên các nhà cung cấp miễn phí và khó cấu hình, lưu trữ tệp phẳng yêu cầu quá nhiều mã . – thenickdude

16

Bạn đang tìm kiếm mã hóa "một lần đệm". Nó lấy chìa khóa và bổ sung modulus vào các ký tự để tạo chuỗi được mã hóa.

function ecrypt($str){ 
    $key = "abc123 as long as you want bla bla bla"; 
    for($i=0; $i<strlen($str); $i++) { 
    $char = substr($str, $i, 1); 
    $keychar = substr($key, ($i % strlen($key))-1, 1); 
    $char = chr(ord($char)+ord($keychar)); 
    $result.=$char; 
    } 
    return urlencode(base64_encode($result)); 
} 


function decrypt($str){ 
    $str = base64_decode(urldecode($str)); 
    $result = ''; 
    $key = "must be same key as in encrypt"; 
    for($i=0; $i<strlen($str); $i++) { 
    $char = substr($str, $i, 1); 
    $keychar = substr($key, ($i % strlen($key))-1, 1); 
    $char = chr(ord($char)-ord($keychar)); 
    $result.=$char; 
    } 
return $result; 
} 

Vì vậy, đó là mã hóa chuỗi đơn giản.Những gì tôi sẽ làm là sắp đặt từng mảng các tham số của người dùng và vượt qua nó như là một biến trong liên kết:

$arr = array(
    'pet_name'=>"fido", 
    'favorite_food'=>"cat poop", 
    'unique_id'=>3848908043 
); 
$param_string = encrypt(serialize($arr)); 

$link = "/load_pet.php?params=$param_string"; 

Trong load_pet.php bạn nên làm điều ngược lại:

$param_string = $_GET["params"]; 
$params = unserialize(decrypt($param_string)); 

Bam.

+0

Tất nhiên đây chỉ là một phác thảo thô .. bạn sẽ phải xử lý trường hợp người dùng vượt qua một param_string không hợp lệ .. ví dụ: nó sẽ không unserialize vì vậy bạn đã gotta bắt điều đó. –

+1

Tôi không thấy bất cứ điều gì ở đây mà sẽ cung cấp cho kết quả đầu ra khác nhau cho cùng một đầu vào, đó là những gì tôi đang tìm kiếm. – thenickdude

+0

Xin lỗi, tôi đã hiểu lầm .. :) – thenickdude

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