2008-09-19 36 views
12

Tôi muốn mã hóa các chuỗi có khả năng chỉ có thể có khoảng ba hoặc bốn ký tự nhưng chạy đến khoảng hai mươi ký tự. Hàm băm (md5, sha1, crypt v.v.) không phù hợp vì tôi muốn có thể giải mã thông tin. Tiện ích mở rộng mcrypt có một loạt các khả năng khó khăn.Cách tốt nhất để mã hóa một chuỗi rất ngắn trong PHP là gì?

Có ai có bất kỳ ý tưởng nào về cách tốt nhất để mã hóa an toàn chuỗi ngắn và lý do tại sao không? Có ai có bất kỳ liên kết đến bất kỳ tài liệu giới thiệu một lập trình viên bình thường cho các kịch bản mã hóa thực tế?

+1

3-20 nhân vật, đây không phải là mật khẩu, phải không? Mã hóa một chiều hầu như luôn là lựa chọn tốt hơn cho mật khẩu. –

Trả lời

4

Tôi rất khuyên bạn nên đề xuất của Chris Kite. Nếu không biết nhiều hơn về những gì bạn đang làm, tại sao, và các mối đe dọa bạn dự đoán cần phải bảo vệ chống lại AES-128 là đủ khả năng. Khả năng sử dụng mã hóa đối xứng là rất tốt cho một ứng dụng độc lập sẽ là cả bộ giải mã và mã hóa dữ liệu. Vì cả hai số , Chris KiteArachnid cho biết, do kích thước nhỏ dữ liệu của bạn, nên bạn hãy đệm dữ liệu và sử dụng Vector khởi tạo ngẫu nhiên.

Cập nhật: Đối với lý do tại sao .... nếu dữ liệu là đủ nhỏ, và IV có thể được dự đoán, nó có thể để brute buộc các văn bản đơn giản bằng cách tạo ra mật mã văn bản cho mỗi sự kết hợp của đồng bằng -text với IV đã biết và kết hợp nó với văn bản mã hóa đã chụp. Tóm lại, đây là cách các bảng cầu vồng hoạt động.

Bây giờ, nếu bạn định mã hóa trên một máy chủ và giải mã trên máy chủ khác, tôi sẽ thực hiện theo các đề xuất của pdavis. Bằng cách sử dụng một phương pháp bất đối xứng, bạn có thể tách các khóa mã hóa khỏi các khóa giải mã. Bằng cách này, nếu máy chủ mã hóa dữ liệu bị xâm phạm, kẻ tấn công vẫn không thể giải mã dữ liệu.

Nếu bạn có thể, nó sẽ giúp cộng đồng biết thêm về trường hợp sử dụng của bạn để mã hóa. Như tôi đã đề cập ở trên, việc hiểu đúng về các mối đe dọa hợp lý là chìa khóa khi đánh giá các điều khiển bảo mật.

3

Có vấn đề gì nếu ai cũng có thể giải mã? Nếu bạn chỉ đang cố gắng làm xáo trộn nó một chút, hãy sử dụng ROT13. Đó là trường học cũ.

+6

Bạn có thực sự đề xuất ROT13 trong một bài đăng mật mã không? –

+5

Holy crap, dude. Bạn có thể đọc không? "Liệu có ai có thể giải mã nó không?" ROT13 là một mã hóa hợp lệ. Tầm thường của nó để phá vỡ, nhưng điều đó không nhất thiết phải là vấn đề luôn luôn. Tôi đã đủ rõ ràng về điều đó, phải không? – Will

0

Bất kỳ thuật toán mã hóa một chiều nào như Blowfish sẽ làm, tôi đoán vậy. Blowfish nhanh và cởi mở. Bạn có thể sử dụng Blowfish thông qua hàm crypt(). AFAIK không có thuật toán mã hóa hoạt động đặc biệt tốt trên các chuỗi nhỏ. Một điều cần lưu ý là mặc dù các dây nhỏ như vậy sẽ rất dễ dàng. Có lẽ bạn nên mã hóa chuỗi cùng với giá trị muối 'bí mật' để tăng cường bảo mật.

+0

Hiệu chỉnh: phiên bản crypt() không phù hợp vì nó không có cách giải mã. Sử dụng một cái gì đó như http://pear.php.net/package/Crypt_Blowfish. Điều đó sẽ cung cấp cho bạn thêm lợi thế là không phải lo lắng về việc cài đặt thêm phần mở rộng. – Roel

6

Tôi thích sử dụng GnuPG cho mọi thứ cần được mã hóa trên máy chủ và sau đó có thể được giải mã trên máy chủ hoặc trên máy chủ khác (thường là trường hợp của tôi). Điều này cho phép thêm một mức độ bảo mật vì trong kịch bản của tôi, máy chủ mã hóa không có khóa để giải mã dữ liệu. Nó cũng cho phép giải mã thủ công dễ dàng hơn. Có một vài trình bao bọc tốt có sẵn cho các ngôn ngữ khác nhau (một ưu điểm khác), một cho PHP là GnuPGP PHP Class.

2

Nếu bạn muốn mã hóa và giải mã dữ liệu trong một ứng dụng, rất có thể bạn muốn sử dụng mật mã khóa đối xứng. AES, là thuật toán mã hóa khối đối xứng được chứng nhận bởi NSA để đảm bảo dữ liệu bí mật hàng đầu, là lựa chọn tốt nhất của bạn. Có một bản thực thi thuần PHP có sẵn tại www.phpaes.com

Để bạn sử dụng, có vẻ như AES128 là đủ. Bạn sẽ muốn sử dụng chế độ CBC với một vector khởi tạo ngẫu nhiên, nếu không dữ liệu giống nhau sẽ luôn tạo ra cùng một bản mã.

Chọn thuật toán mã hóa phù hợp là bước đầu tiên tốt, nhưng có nhiều yếu tố dẫn đến một hệ thống bảo mật khó có được quyền, chẳng hạn như quản lý khóa. Có những tài nguyên tốt ngoài đó, chẳng hạn như Mật mã ứng dụng của Bruce Schneier và Kỹ sư bảo mật của Ross Anderson (có sẵn trực tuyến miễn phí).

6

mcrypt được liên kết với hầu hết các bản dựng PHP theo mặc định. Nó chứa tất cả các nguyên thủy bạn có thể cần. Nếu không biết nhiều hơn về những gì bạn đang mã hóa, mô hình mối đe dọa của bạn là gì, vv, thật khó để đưa ra các khuyến nghị cụ thể về thuật toán, phương thức hoạt động, vv để sử dụng.

Một điều tôi có thể nói chắc chắn: Với chuỗi văn bản ngắn, điều quan trọng hơn bao giờ hết là bạn PHẢI sử dụng một Vector khởi tạo ngẫu nhiên duy nhất. Nếu không, nó là tầm thường cho một người nào đó để gắn kết một loạt các cuộc tấn công chống lại các dữ liệu được mã hóa.

1

Tôi đồng ý với Chris Kite - chỉ cần sử dụng AES 128, điều này là đủ xa.

Tôi không biết chính xác môi trường của bạn, nhưng tôi đoán bạn đang truyền dữ liệu bằng cách nào đó qua internet.

Không sử dụng ECB, điều này sẽ luôn tạo ra cùng một kết quả cho cùng một văn bản thuần túy.

Chế độ CBC là cách để đi và đừng quên một vector khởi tạo ngẫu nhiên. Vector này phải được truyền thông với văn bản mật mã và có thể được gửi đi trong suốt.

Về dữ liệu của bạn, vì AES là mật mã khối, kết quả luôn là bội số của kích thước khối. Nếu bạn không muốn cho người quan sát biết nếu dữ liệu của bạn ngắn hoặc dài, hãy thêm một số phần đệm để mở rộng nó lên đến kích thước tối đa mong đợi.

0

Bạn có thể sử dụng những ý tưởng lập trình nói chung mà không cần dựa vào xây dựng trong mã hóa/chức năng decription Ví dụ tạo một hàm gọi nó là

function encryptstring($string) { 

$string_length=strlen($string); 
$encrychars=""; 
/** 
*For each character of the given string generate the code 
*/ 
for ($position = 0;$position<$string_length;$position++){   
    $key = (($string_length+$position)+1); 
    $key = (255+$key) % 255; 
    $get_char_to_be_encrypted = SUBSTR($string, $position, 1); 
    $ascii_char = ORD($get_char_to_be_encrypted); 
    $xored_char = $ascii_char^$key; //xor operation 
    $encrypted_char = CHR($xored_char); 
    $encrychars .= $encrypted_char; 
} 
/** 
*Return the encrypted/decrypted string 
*/ 
return $encrychars; 
} 

Trên trang với liên kết để bao gồm các id của yêu cầu phải được mã hóa

/** 
    *While passing the unique value to a link 
    *Do the following steps 
    */ 

    $id=57;//or if you are fetching it automatically just pass it here 
    /** 
    *For more security multiply some value 
    *You can set the multiplication value in config file 
    */ 
    $passstring=$id*346244; 
    $encrypted_string=encryptstring($passstring); 
    $param=urlencode($encrypted_string); 
    /** 
    *Derive the url for the link 
    */ 
    echo '<a href="target_file.php?aZ98#9A_KL='.$param.'">something</a>' ; 

Trên tập tin mục tiêu mà có được mở sau khi liên kết được nhấp

 /** 
     *Retriving the value in the target file 
     *Do the following steps 
     */ 
     $fetchid=$_GET['aZ98#9A_KL']; 
     $passstring=urldecode(stripslashes($fetchid)); 
     $decrypted_string= encryptstring($passstring); 
     /** 
     *Divide the decrypted value with the same value we used for the multiplication 
     */ 
     $actual_id= $decrypted_string/346244; 
Các vấn đề liên quan