2011-02-24 70 views
18

Tôi đang sử dụng thư viện mcrypt của PHP và thuật toán AES-256 (rijndael), yêu cầu cả vectơ khởi tạo + khóa chính.Mã hóa: Sử dụng vectơ khởi tạo vs khóa?

Bộ não logic hợp lý của tôi không thực sự phù hợp với điều này. Không chỉ là một chìa khóa đủ?

kịch bản lý thuyết:
Nếu tôi đã mã hóa dữ liệu nhạy cảm được lưu trữ trong một cơ sở dữ liệu, mà chỉ chủ sở hữu sẽ có thể giải mã, nó sẽ là thích hợp để sử dụng cho người sử dụng băm mật khẩu hoặc là chìa khóa hoặc khởi tạo vector cho dữ liệu của mình?

Khóa có nên được coi là riêng tư hơn so với vectơ khởi tạo hay là cách khác xung quanh?

+2

+1 câu hỏi hay. – rook

Trả lời

11

Không, trên thực tế IV là yếu tố quan trọng trong hầu hết các triển khai. IV cũng được coi là an toàn cho sử dụng công cộng, ví dụ IV được truyền trong văn bản thuần cho WEP và WPA1/WPA2. Vấn đề phát sinh khi cùng một khóa + iv này được sử dụng để mã hóa cùng một văn bản thuần túy. Các văn bản mật mã sẽ giống hệt nhau, trừ khi bạn sử dụng IV. Nếu kẻ tấn công có thể mã hóa văn bản thuần tuý tùy ý bằng phím này, sau đó xem văn bản mật mã. Đây là một cách nhanh hơn nhiều của brute buộc văn bản mật mã khác mà kẻ tấn công đã thu được.

Không chỉ vậy, IV phải là ngẫu nhiên hoặc bạn sẽ vi phạm CWE-329. Lý do tại sao đây là một vấn đề phức tạp hơn một chút và I didn't get it at first. Bạn không đề cập đến điều này, nhưng tôi hy vọng bạn đang sử dụng hoặc CBC or CMAC modes

Việc sử dụng hàm băm trên mật khẩu gần giống với việc sử dụng hàm String2Key. Đây là một thiết kế chắc chắn miễn là kẻ tấn công không thể sử dụng SQL Injection để lấy khóa.

+0

Xin chào Rook. Đó là tất cả tin tức đối với tôi. Cảm ơn rất nhiều! Tôi nên được an toàn sau đó nếu tôi sử dụng 'CFC' với một IV không ngẫu nhiên? – Industrial

+0

@Industrial Trên thực tế, chế độ CBC' của nó và IV ** phải là ngẫu nhiên. Trong cơ sở dữ liệu, bạn có thể có một cột cho iv và tạo ra số này bằng cách sử dụng 'mt_rand()'. – rook

+0

@Rook Hmm. Tôi đã không thể giải mã các chuỗi được mã hóa của mình mà không có IV phù hợp giữa mã hóa và giải mã, vì vậy không có sự ngẫu nhiên nào thực sự xảy ra. Có lẽ tôi đang làm điều gì đó sai hoặc bạn đang nói rằng IV luôn luôn nên được hoàn toàn ngẫu nhiên? – Industrial

6

Vector khởi tạo (IV) không phải là chìa khóa ở tất cả và không phải là bí mật. Trong thực tế, nó thường được tiếp xúc (ví dụ: được thêm vào dữ liệu được mã hóa). Nó được sử dụng như một đầu vào ngẫu nhiên bổ sung cho thuật toán mã hóa để kết quả mã hóa cùng một dữ liệu rõ ràng là khác nhau mỗi khi bạn sử dụng một IV khác nhau. Bằng cách này, không thể thu thập số liệu thống kê trên dữ liệu được mã hóa. Nó không "cải thiện" sức mạnh mã hóa của chính nó.

Bạn có thể xem here để có sơ đồ đẹp cho biết cách sử dụng và lý do tại sao IV được sử dụng.

+0

Tuyệt vời. Cảm ơn! – Industrial

7

Không sử dụng mật khẩu băm làm nguồn duy nhất cho khóa và IV. Theo quy tắc chung, bạn nên tạo ngẫu nhiên IV MỌI THỜI GIAN bạn cập nhật dữ liệu được mã hóa và lưu trữ IV với dữ liệu này. Khóa có thể được tái sử dụng nhiều lần, nhưng sử dụng băm muối và lưu trữ muối với dữ liệu quá.

Nếu bạn chỉ băm mật khẩu người dùng và sử dụng mật khẩu này làm khóa mã hóa, người dùng có cùng mật khẩu sẽ có cùng một khóa. Tùy thuộc vào cấu trúc cơ sở dữ liệu của bạn và quyền truy cập của kẻ xâm nhập có thể có một số trường hợp đáng tiếc khi người dùng có cùng mật khẩu có thể được phát hiện. Thêm ít nhất tên người dùng duy nhất vào băm này.

Nếu bạn không thay đổi IV cho mọi cập nhật dữ liệu, thông tin về thay đổi dữ liệu có thể bị rò rỉ. Với chế độ CBC hoặc CFB, các khối bản rõ đầu tiên giống nhau sẽ được mã hóa thành bản mã giống hệt nhau cho đến khi thay đổi bản rõ đầu tiên, vì vậy vị trí của thay đổi này có thể được xác định.

+0

lời khuyên rất quan trọng – davka

+0

Cảm ơn rất nhiều lời khuyên! – Industrial

+0

Vì vậy, thay vì một trường trong DB bạn hiện cần ít nhất 3? Giá trị mã hóa, IV và Muối? Chúng tôi thậm chí có thể thêm chìa khóa vào nó mà sẽ làm cho nó 4 lĩnh vực trong DB (OFC tôi sẽ không lưu chìa khóa để DB mặc dù). Âm thanh như rất nhiều công việc, có thể không cần thiết? – Piero

0

Nếu bạn đang sử dụng chế độ EBP của mật mã khối hoặc hầu hết các thuật toán mã hóa dòng, các tổ hợp phím + IV giống nhau trên các bản rõ khác nhau sẽ cung cấp cho người tấn công một cái nhìn trực tiếp về kết quả XOR của khóa.Điều này bằng cách mở rộng cho thấy chìa khóa chính nó và một số phạm vi mật khẩu.

Nhưng tôi có nghĩa là IV chắc chắn là cần thiết không? Không. Miễn là bạn thay đổi mật khẩu của bạn mỗi lần vào khối văn bản tiếp theo của bạn (ngay cả cùng một khối lần thứ hai), bạn hoàn toàn ổn mà không có IV. Trong thực tế, tất cả những gì mà IV làm là tự động hóa quá trình trên.

+0

Chế độ EBP là gì? Không bao giờ nghe nói về một và tìm kiếm nhanh chóng không bật lên bất cứ điều gì cả. Chế độ OFB và CTR bị rò rỉ khóa chính vì chúng có mật mã dòng mã hiệu quả. Nhưng không có chế độ phổ biến nào rò rỉ chính khóa đó. – CodesInChaos

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