2010-01-10 75 views
7

Một vài năm trước, khi lần đầu tiên được giới thiệu với ASP.net và .NET Framework, tôi đã xây dựng một hệ thống lưu trữ tệp trực tuyến rất đơn giản. Hệ thống này sử dụng mã hóa Rijndael để lưu trữ các tệp được mã hóa trên ổ cứng của máy chủ và HttpHandler để giải mã và gửi các tệp đó đến máy khách. Là một trong những dự án đầu tiên của tôi với ASP.net và cơ sở dữ liệu, không hiểu nhiều về cách thức hoạt động (cũng như rơi xuống same trap described by Jeff Atwood on this subject), tôi quyết định lưu trữ các khóa và IV mới được tạo cùng với mỗi mục nhập tệp trong cơ sở dữ liệu.AES Mã hóa và lưu trữ khóa?

Để làm cho mọi việc trở nên rõ ràng hơn, mã hóa chỉ nhằm bảo vệ tệp khỏi truy cập trực tiếp vào máy chủ và các khóa không được tạo bởi mật khẩu do người dùng nhập.

Câu hỏi của tôi là, giả sử tôi không muốn giữ một khóa cho tất cả các tệp, cách nên Tôi lưu trữ khóa mã hóa để bảo mật tốt nhất? Những gì được coi là thực hành tốt nhất? (ví dụ: Trên một máy chủ khác, trên một tệp văn bản thuần túy, được mã hóa).

Ngoài ra, vectơ khởi tạo được sử dụng cho loại thuật toán mã hóa này là gì? Nó có nên liên tục trong một hệ thống không?

Trả lời

11

Khóa cần được bảo vệ và giữ bí mật, đơn giản như vậy. Việc thực hiện là không. Hệ thống quản lý khóa được bán với số tiền lớn bởi các nhà cung cấp đáng tin cậy vì giải quyết vấn đề là cứng.

Bạn chắc chắn không muốn sử dụng cùng một khóa cho mỗi người dùng, càng có nhiều phím được sử dụng "dễ dàng hơn" để phá vỡ hoặc ít nhất có một số rò rỉ thông tin. AES là một thuật toán mã khối, nó chia dữ liệu thành các khối và cung cấp các kết quả của việc mã hóa khối cuối cùng vào khối tiếp theo. Một vector khởi tạo là nguồn cấp dữ liệu ban đầu vào thuật toán, bởi vì tại điểm bắt đầu không có gì để bắt đầu. Sử dụng các IV ngẫu nhiên với cùng một khóa làm giảm nguy cơ rò rỉ thông tin - nó sẽ khác nhau đối với từng phần dữ liệu được mã hóa.

Cách bạn lưu trữ khóa phụ thuộc vào cách hệ thống của bạn được kiến ​​trúc. Tôi vừa hoàn thành một KMS nơi các phím được giữ cách xa hệ thống chính và các chức năng mã hóa và giải mã được tiếp xúc thông qua WCF. Bạn gửi văn bản thuần tuý và lấy một tham chiếu đến một khóa và văn bản được mã hóa lại - theo cách đó KMS chịu trách nhiệm cho tất cả các mật mã trong hệ thống. Điều này có thể là quá mức cần thiết trong trường hợp của bạn. Nếu người dùng nhập mật khẩu vào hệ thống của bạn thì bạn có thể sử dụng mật khẩu đó để tạo cặp khóa. Cặp khóa này sau đó có thể được sử dụng để mã hóa một kho khóa cho người dùng đó - XML, SQL, bất cứ thứ gì và được sử dụng để giải mã từng khóa được sử dụng để bảo vệ dữ liệu.

Nếu không biết thêm về cách hệ thống của bạn được định cấu hình, hoặc bạn không nên sử dụng bất kỳ mục nào khác ngoài "Khóa phải được bảo vệ, khóa và IV không được sử dụng lại".

+2

quan sát nhỏ : "AES là một mật mã khối, nó chia tách dữ liệu thành các khối và cung cấp các kết quả của việc mã hóa khối cuối cùng vào khối tiếp theo". Bạn đang mô tả phương pháp [CBC] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29) * a * để sử dụng AES một cách an toàn. Có các giải pháp bảo mật khác - không phải tất cả yêu cầu một vectơ khởi tạo. – KovBal

3

Là một soltution khá tốt, bạn có thể lưu trữ chính cặp/IV của bạn trong một bảng:

ID     Key   IV 
skjsh-38798-1298-hjj FHDJK398720== HFkjdf87923== 

Khi bạn lưu một giá trị được mã hóa, lưu ID và một giá trị muối ngẫu nhiên cùng với nó.

Sau đó, khi bạn cần giải mã giá trị, tra cứu cặp khóa/iv bằng id và muối được lưu trữ với dữ liệu.

Bạn muốn đảm bảo rằng bạn có một mô hình bảo mật tốt xung quanh bộ nhớ khóa. Nếu bạn đã đi với máy chủ SQL, không cấp quyền SELECT cho người dùng truy cập cơ sở dữ liệu từ ứng dụng.Bạn sẽ không muốn cung cấp cho ai đó quyền truy cập vào toàn bộ bảng.

+3

Đây là một giải pháp rất tốt nếu bạn xác định chính máy chủ SQL như vốn đã bảo mật và lưu trữ các khóa trong đó đáp ứng các yêu cầu về bảo mật của bạn. Điều này có thể được thực hiện thêm bằng cách cho phép mã hóa dữ liệu trong suốt trên máy chủ sql để ngăn chặn một cuộc tấn công mà một người nào đó sao chép DB ra khỏi máy chủ, hoặc thực tế lấy ổ đĩa cứng để bỏ qua tất cả các điều khiển truy cập phần mềm. –

3

Có một bài viết rất hay về bài viết này tại số http://web.archive.org/web/20121017062956/http://www.di-mgt.com.au/cryptoCreditcard.html bao gồm cả vấn đề về IV và muối và các vấn đề với ECB được đề cập ở trên.

Nó vẫn không hoàn toàn che "nơi nào tôi lưu trữ chìa khóa", thừa nhận, nhưng sau khi đọc và tiêu hóa nó, nó sẽ không thể là một bước nhảy vọt rất lớn đến một giải pháp hy vọng ....

+1

liên kết bài viết bị hỏng – CodeClimber

+0

câu trả lời 2 năm tuổi và tên miền tôi không kiểm soát. Thời gian sử dụng Máy khôi phục Lưu trữ Internet .... –

+2

Đối với những người lười biếng - http://web.archive.org/web/20121017062956/http://www.di-mgt.com.au/cryptoCreditcard.html –

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