Trong Phần 1 của loạt bài này, tôi đã giới thiệu về Mã hóa XML, cú pháp cơ bản của nó và quá trình xử lý. Tôi đã kiểm tra các thẻ khác nhau và cách dùng của chúng trong Mã hóa XML với một ví dụ đơn giản về cách trao đổi an toàn dữ liệu cấu trúc đưa ra một Java API cho Mã hóa XML dựa trên DOM, và đưa ra một bản tổng quan ngắn gọn về mã hóa trong Java (JCA/JCE).
Tôi bắt đầu bài thảo luận của mình ở phần này với một tình huống trao đổi thông tin, minh họa cho việc sử dụng mã hóa XML.
Xem xét quá trình trao đổi thông tin giữa hai bên doanh nghiệp. Một là nhà bán sách trực tuyến và bên kia là nhà xuất bản. Khi nhà bán sách trực tuyến muốn mua sách, họ gửi một yêu cầu mua tới nhà xuất bản. Ở phía bên nhà xuất bản, phòng bán hàng nhận yêu cầu này, xử lý nó, và chuyển tới phòng kế toán. Hai doanh nghiệp trao đổi thông tin theo dạng thức các tài liệu XML. Bởi vì một phần tài liệu cần phải được bảo mật và phần còn lại có thể không, mã hóa XML là cách tự nhiên để áp dụng bảo mật cho các lựa chọn riêng biệt của tài liệu.
Theo chính sách bảo mật của nhà bán sách, thông tin thanh toán sẽ chỉ được thông báo cho phòng kế toán. Phòng bán hàng sẽ chỉ cần trích xuất ra tên sách, ID của sản phẩm và số lượng yêu cầu; bởi vì đây là thông tin không nhạy cảm, nó có thể không cần phải giữ bí mật. Phòng kế toán sẽ cần giải mã thông tin thanh toán trong yêu cầu mua sử dụng khóa bí mật đã được trao đổi trước. (Chú ý rằng Mã hóa XML chỉ là mã hóa và giải mã các thông tin có cấu trúc và không đặt ra bất cứ phương thức trao đổi khóa nào cụ thể cả.) Theo chính sách này, Mã hóa XML tạo điều kiện cho việc giấu đi thông tin thanh toán ở phòng bán hàng và giải mã ra khi đến phòng kế toán.
Tại thời điểm này, sẽ hữu ích để ta suy nghĩ một chút về khái niệm bảo mật dựa trên tài liệu. Với kiến trúc bảo mật này, bạn có thể đặt bảo mật ở mức độ tài liệu. Ngữ cảnh của một phiên bảo mật được bảo vệ một cách hiệu quả bên trong tài liệu bảo mật. Tất cả các thông tin mà một bên có thẩm quyền có thể cần để giảm mã tài liệu đều có sẵn trong tài liệu đó. Một phiên bảo mật mang tính logic được tạo ra, nó linh hoạt, tồn tại một cách lâu dài và cho phép nhiều bên cùng tham gia vào một phiên giao dịch bảo mật. Một giao thức sắp tới cho các dịch vụ Web, Giao thức Giao dịch Thương mại (BTP -- xem Tài nguyên), dựa trên cùng một khái niệm về duy trì ngữ cảnh của một phiên bên trong tài liệu giao dịch; điều này giúp cho giao dịch được lâu dài và đảm bảo được tính linh hoạt.
Để hoàn tất các yêu cầu của tình huống trao đổi dữ liệu bảo mật giữa nhà
xuất bản và nhà bán sách ở phía trên, tôi đã tạo ra một lớp ứng dụng dùng
thử được gọi là demoXmlEncApp (xem Ví dụ 1). Lớp này sử dụng lớp
thực thi mẫu Mã hóa XML XmlEncryption (xem Ví dụ 2).
Ứng dụng dùng thử làm được những gì
Phương thức main của lớp demoXmlEncApp ban đầu thực hiện việc xử lý bên phía nhà bán
sách bằng cách gọi phương thức simulateBookSellersEnd, phương thức này đọc tệp XML yêu cầu
mua, Order.xml (xem Ví dụ 3), và mã hóa thông tin
nhạy cảm trong đó thông qua một trong ba phương thức mã hóa (đó là mã hóa
tệp XML trọn vẹn, mã hóa phần tử, hay mã hóa nội dung phần tử) được chỉ
định trong Mã hóa XML. Sau đó nó lưu tệp XML đã được mã hóa vào ổ đĩa,
cũng như là khóa được sử dụng để mã hóa.
Ví dụ 3. Order.xml
<?xml version="1.0"?> <!-- This Listing provides the sample XML File that will be encrypted. --> <purchaseOrder> <Order> <BookName>Soccer For Dummies</BookName> <Id>123-958-74598</Id> <Quantity>500</Quantity> </Order> <Payment> <CardNo>4502-3456-3278-2011</CardNo> <CardType>VISA</CardType> <ValidDate>12-10-2004</ValidDate> </Payment> </purchaseOrder> |
Bởi vì các giao thức trao đổi tệp và trao đổi khóa không phải là trọng tâm
ở đây, vì thế tôi giả thiết rằng chúng được tạo ra sẵn cho nhà xuất bản
thông qua bất cứ phương thức thích hợp nào đó (Ví dụ, tệp XML đã được mã
hóa và khóa bí mật được trao đổi thông qua HTTP và một số thuật toán mã
hóa khóa công khai tương ứng). Phương thức main
sau đó lấy vai trò của nhà xuất bản bằng cách gọi phương thức simulatePublishersEnd, phương thức này sẽ lấy ra
các thông tin phòng bán hàng cần, và sau đó hiển thị tệp XML trên bảng
điều khiển. Tiếp đến, nó giải mã thông tin thanh toán cho phòng kế toán và
hiển thị nó ở bảng điều khiển.
Hàm simulateBookSellersEnd trong lớp demoXmlEncApp ban đầu minh họa một đối tượng
XmlEncryption và gọi các phương thức thiết
lập khác nhau của XmlEncryption để thiết lập
các thuộc tính sau:
clearDoc: Dạng đối tượng DOM của tệp XML (xem Ví dụ 3) được mã hóaencKey: Một khóa được sử dụng cho việc mã hóaalgoName: Tên của thuật toán mã hóakeyName: Tên của khóa mã hóa; tên này trở thành giá trị của nút văn bản con của phần tửKeyNametrong suốt quá trình mã hóa XML như được giải thích trong phần 1encId: Tên được đặt cho thẻEncryptedDatalà duy nhất trong tài liệu
Phương thức simulateBookSellersEnd của lớp demoXmlEncApp gọi các phương thức khác nhau của
bộ máy Mã hóa XML (Lớp XmlEncryption) phụ thuộc
vào các đối số dòng lệnh được gán trong khi gọi ứng dụng. Hãy xem điều gì
xảy ra bên trong lớp XmlEncryption, bộ máy xử
lý Mã hóa XML chính.
Các chi tiết của việc thực thi Mã hóa XML
Tôi đã giới thiệu một phần API mã hóa XML đã được đặt ra trong phần 1. Hãy
nhớ lại rằng tôi đã có một phương thức gọi là encryptCompleteXmlFile trong lớp XmlEncryption (xem Ví dụ 11 của phần 1) để mã hóa một tệp XML hoàn
chỉnh. Cùng với phương thức encryptCompleteXmlFile, bây giờ tôi đã thêm hai phương thức
sau để phục vụ các yêu cầu mã hóa các loại dữ liệu khác nhau (phân tách mã
hóa):
encryptElementOfXmlFileđể mã hóa một phần tử đặc biệt trong tệp XMLencryptElementContentOfXmlFileđể mã hóa nội dung của một phần tử đặc biệt trong tệpXML
Nhà bán sách có thể bảo mật thông tin nhạy cảm trong yêu cầu mua bằng cách
áp dụng bất cứ một trong ba phương thức mã hóa XML của lớp XmlEncryption :
- Mã hóa một tệp XML hoàn chỉnh
- Mã hóa một phần tử trong một tệp XML
- Mã hóa nội dung của một phần tử trong tệp XML
1. Mã hóa một tệp XML hoàn chỉnh với Mã hóa XML
Nhà bán sách có thể mã hóa toàn bộ tệp Order.xml để có một tệp XML mã hóa, có thể gửi tới phòng bán hàng của nhà sản xuất. Mặc dù cách này cung cấp bảo mật tương tự thông qua liên kết giao tiếp đầu cuối - đầu cuối, nhưng chính sách bảo mật của nhà bán sách đã bị ảnh hưởng. Chính sách này yêu cầu giấu đi thông tin thanh toán trong phòng bán hàng và hiển thị nó trong phòng kế toán. Trong trường hợp này, toàn bộ tài liệu XML được giải mã bởi phòng bán hàng và thông tin thanh toán được hiển thị. Vì thế, phương thức này dường như chưa hợp lý, mặc dù nó có thể rất thực tế nếu bạn sử dụng siêu mã hóa (đề cập sau trong bài hướng dẫn này).
Nếu nhà bán sách quyết định mã hóa toàn bộ tệp Order.xml , hàm simulateBookSellersEnd
trong lớp demoXmlEncApp tạo ra một lệnh gọi tới
phương thức công khai encryptCompleteXmlFile
của lớp XmlEncryption.
Phương thức này đầu tiên gọi một phương thức riêng getString để sắp xếp tệp XML mã hóa nó theo dạng chuỗi. Sau
đó, nó gọi phương thức mã hóa getEncryptedData,
trả lại xâu ký tự mã hóa đã được mã hóa cơ số 64. Xâu ký tự mã hóa này sau
đó được gán cho phương thức riêng getCipherDataDoc . Phương thức này tạo ra và trả lại thẻ CipherData với thẻ con CipherValue giữ xâu ký tự mã hóa đã được mã hóa cơ số 64.
Tương tự các thẻ EncryptionMethod và ds:KeyInfo được tạo ra. Ba thẻ này -- đó là CipherData (mang thẻ con của nó là CipherValue ), EncryptionMethod, và ds:KeyInfo --
được sau đó thêm vào như là các thẻ con của thẻ EncryptedData. Thẻ EncryptedData
thực sự được nạp vào đối tượng tài liệu DOM, encDataObj, nó được sắp xếp và trả lại phương thức simulateBookSellersEnd .
2. Mã hóa một phần tử trong một tệp XML với Mã hóa XML
Nhà bán sách có thể mã hóa phần thông tin thanh toán của tệp XML với khóa
bí mật của phòng kế toán, và giải mã phần nội dung còn lại của tệp cho
phòng bán hàng xem. Quá trình xử lý này có thể được thực hiện bằng cách mã
hóa phần tử Payment trong tệp Order.xml. Thông tin thẻ tín dụng được bảo mật vì
nó ở trong các nút con của phần tử mã hóa Payment. Bởi vì yêu cầu bảo mật yêu cầu rằng các phương tiện
thanh toán (như là thẻ tín dụng hay séc ngân hàng) phải được giấu đi đối
với những người xem không có thẩm quyền, mã hóa phần tử Payment sẽ làm được điều đó.
Trong trường hợp này, hàm simulateBookSellersEnd
trong lớp demoXmlEncApp tạo ra một lệnh gọi tới phương thức công
khai encryptElementOfXmlFile của lớp XmlEncryption. Phương thức riêng getElement trả lại nút phần tử mà sau đó được tạo ra và mã hóa
để sinh ra thẻ CipherData. Quá trình tạo ra thẻ
EncryptedData tương tự như trước, ngoại trừ
việc phương thức này thay thế phần tử Payment
trong clearDoc bằng phần tử EncryptedData bằng cách gọi phương thức riêng replaceElement. Sau khi việc thay thế được diễn
ra, clearDoc được tạo ra và trả về.
3. Mã hóa nội dung một phần tử trong tệp XML bằng Mã hóa XML
Cách mã hóa thứ ba mà nhà bán sách có thể sử dụng đó là chỉ mã hóa số thẻ
tín dụng trong Order.xml. Phương thức mã hóa nội
dung phần tử được dẫn ra cho phép mã hóa chỉ nội dung văn bản của phần tử
CardNo. Việc này sẽ dẫn đến một vấn đề quan
trọng đó là: Tại sao bạn cần mã hóa nội dung khi mà vẫn có thể mã hóa toàn
bộ phần tử? Việc sử dụng một trong hai phương thức phụ thuộc vào chính
sách bảo mật của tài liệu; nếu có nhu cầu khai báo tên của phần tử hay các
thuộc tính của nó, trong khi giữ bảo mật nội dung, thì mã hóa nội dung là
cần thiết.
Nếu nhà bán sách chỉ muốn giấu số thẻ tín dụng, nội dung văn bản của phần
tử CardNo trong Order.xml được mã hóa. Phương thức simulateBookSellersEnd gọi phương thức công khai encryptElementContentOfXmlFile, khác với phương
thức encryptElementOfXmlFile chỉ ở chỗ nó hoạt động trên nội dung của phần
tử chứ không phải là trên chính phần tử đó.
Sử dụng Mã hóa XML để giải mã một tệp mã hóa XML
Khi bên nhà xuất bản nhận được một tệp mã hóa XML, nó sẽ cần phải được
giải mã. Trong cả ba phương thức mã hóa đã miêu tả, phương thức giải mã là
getDecryptedData. Phương thức simulateBookSellersEnd trong demoXmlEncApp sắp xếp tệp mã hóa XML vào một chuỗi văn
bản và chuyển nó tới phương thức getDecryptedData để giải mã.
Phương thức getDecryptedData xác định các thẻ
EncryptedData và trích xuất giá trị mã hóa
đã được mã hóa cơ số 64. Tất cả các thông tin cần thiết để giải mã là có
trong các thẻ Mã hóa XML: tên của thuật toán mã hóa, loại dữ liệu đã được
mã hóa, và tên của chìa khóa mã hóa.
Chú ý: Chi tiết Mã hóa XML không yêu cầu rằng tất cả thông tin này phải có trong các thẻ Mã hóa XML. Các thuộc tính này có hay không cũng tùy. Ứng dụng có thể cung cấp thông tin này thông qua một số phương tiện khác, nhưng ứng dụng dùng thử và thực thi Mã hóa XML mẫu giả thiết rằng tất cả các thông tin có trong các thẻ Mã hóa XML.
Phương thức getDecryptedData bây giờ tạo ra một
khóa giải mã từ những tên thuật toán và khóa. Sau đó nó chuyển giá trị mã
hóa mã hóa cơ số 64, khóa giải mã, và tên thuật toán tới một phương thức
có tên Decrypt (được kiểm tra trong Mã hóa).
Phương thức Decrypt trả lại dữ liệu đã được giải
mã như một chuỗi ký tự. Chuỗi ký tự này được điều khiển theo loại thuộc
tính của phần tử EncryptionData có thể là một
trong các loại sau:
- Một tệp XML hoàn chỉnh được lưu vào ổ đĩa làm một tệp XML mới
- Một phần tử thay thế thẻ
EncryptedDatađể tạo ra tệp XML gốc - Nội dung của một phần tử, có thể thay thế thẻ
EncryptedDatađể tạo ra tệp XML gốc
Khi bạn sử dụng siêu mã hóa, bạn có thể mã hóa chỉ thông tin thanh toán với khóa bí mật của phòng kế toán để tạo ra tệp XML mã hóa phần tử. Tệp được tạo ra này sau đó được mã hóa hoàn toàn sử dụng khóa bí mật của phòng bán hàng, vì thế nó tạo ra một tệp XML siêu mã hóa.
Ở đây tôi phải chỉ ra rằng, với chỉ số Mã hóa XML, bạn có thể mã hóa lại
một tệp XML được mã hóa tạo ra một tệp XML siêu mã hóa. Nhưng, bạn không
thể mã hóa một con đặc biệt của các phần tử EncryptedData hay EncryptedKey sử
dụng mã hóa XML. Nói cách khác, một phần tử EncryptedData không thể là bố mẹ hay là con của một phần tử
EncryptedData khác.
Theo chỉ số Mã hóa XML, bạn cũng có thể mã hóa dữ liệu bất kỳ (ví dụ, một
hình ảnh .jpg hay trên thực tế là bất cứ thứ gì trên Web). Điều này gần
như giống với việc mã hóa một tệp XML hoàn chỉnh; điểm khác biệt duy nhất
là giá trị của loại thuộc tính cho phần tử EncryptedData (xem Tài nguyên).
Chỉ số Mã hóa XML liệt kê một số các thuật toán mật mã tùy chọn và yêu cầu bao gồm:
- Mã hóa khối
- Mã hóa luồng
- Chuyển khóa
- Đồng ý khóa
- Gói khóa đối xứng
- Liệt kê tin nhắn
- Xác thực tin nhắn
Thuật toán mã hóa cơ số 64 (xem Tài nguyên) cũng được yêu cầu. Mỗi mã hóa phải được mã hóa cơ số 64 trước khi nó có thể được thêm vào một tài liệu XML. Trong phần giới thiệu này, tôi sử dụng thuật toán mã hóa khối TripleDES của nhà cung cấp mã hóa SunJCE. Chế độ mã hóa là CBC (Móc Nối Khối Mã hóa) với kích thước khối 8-byte.
Lớp XmlEncryption sử dụng mã hóa JCA/JCE, được thực thi
bởi các phương thức sau:
getEncryptedData: phương thức này chấp nhận môt chuỗi văn bản và mã hóa nó sử dụng thuật toán TripleDES. Đối với mã hóa đối xứng (xem Tài nguyên), bạn cần một khóa mã hóa thêm vào dữ liệu không mã hóa đã được mã hóa. Khóa này có sẵn như một thuộc tính riêng,encKey, của lớpXmlEncryption. Chuỗi văn bản nhập vào được chuyển đổi thành một chuỗi các byte và được thêm vào. Tôi sử dụng một thuật toán mã hóa khối để mã hóa yêu cầu các byte dữ liệu không mã hóa thành các khối 8 byte, vì thế tôi thêm khối chưa hoàn chỉnh cuối cùng với một số ký tự. Thực thi mẫu sử dụng một dấu cách (" ") làm ký tự để thêm.Tiếp đến tôi tạo một đối tượng lớp
Ciphervà triển khai nó trong chế độ mã hóa. Sau đó tôi trích xuất vector khởi động (IV) vào một chuỗi byte, mã hóa khối dữ liệu không mã hóa, và gắn tiền tố các byte IV vào các byte dữ liệu đã mã hóa. Khi tôi sử dụng phương thứcgetBase64Encodedcủa lớpXmlEncryption, thì chuỗi byte nhận được sau đó sẽ được chuyển thành một chuỗi mã hóa cơ số 64 và sau đó được trả lại.Decrypt: phương thức này cơ bản đối lập với phương thứcgetEncryptedData. Nó chấp nhận chuỗi byte mã hóa cơ số 64, và giải mã nó để trả lại chuỗi dữ liệu không mã hóa. IV sau đó được tách ra khỏi chuỗi byte mã hóa thực. Một đối tượng lớpCipherđược tạo ra và triển khai ở trong chế độ giải mã. Chuỗi byte mã hóa sau đó được mã hóa, và chuỗi byte giải mã được trả lại là một chuỗi văn bản.
Tôi đã cung cấp hỗ trợ cho thuật toán khối cypher TripleDES chỉ là để minh họa. Với một vài điều chỉnh, bạn cũng có thể sử dụng các thuật toán khác như là AES.
Thực thi đơn giản này minh họa cho cách Mã hóa XML có thể làm một mô hình bảo mật khả thi cho các ứng dụng doanh nghiệp phức tạp hơn và lớn hơn.
Giao thức Truy cập Đối tượng Đơn giản, hay SOAP (xem Tài nguyên), là một giao thức dựa trên XML nhẹ ký dành cho trao đổi dữ liệu. Nó thúc đẩy trao đổi dữ liệu được tạo ra từ các cuộc gọi thủ tục và các hồi đáp từ xa. Nó được thiết kế để sử dụng trong các ứng dụng từ xa và chi phối, và nó là một phần của các dịch vụ Web. SOAP cung cấp một phong bì chứa tin nhắn và các thông tin xử lý của nó. Bởi vì nội dung của phong bì này có thể là riêng tư, bảo mật là một vấn đề mà bạn cần phải giải quyết. Mã hóa XML cung cấp một giải pháp trơn tru cho vấn đề này.
Chính SOAP là XML, nó cho phép bạn tự do giải quyết các vấn đề mã hóa theo bất cứ cách nào hợp lý sử dụng Mã hóa XML. Ví dụ, bạn có thể quyết định mã hóa toàn bộ thân SOAP hay một phần của thân. Tuy nhiên, XML-SEC là một nỗ lực W3C nhằm tiêu chuẩn hóa các cách thức thực thi bảo mật trong các dịch vụ Web dựa trên SOAP. Hiện tại, nó không bao gồm Mã hóa XML; tôi nghĩ là Mã hóa XML hay một phương thức mã hóa tương tự làm một phần của nó trong tương lai.
Trong phần 1, tôi đã giới thiệu Mã hóa XML và bàn về cách sử dụng của nó để có được trao đổi dữ liệu an toàn. Tôi đã nói chi tiết về cách sử dụng của các thẻ Mã hóa XML khác nhau và xử lý một Java API cho Mã hóa XML dựa trên DOM.
Ở phần 2 này, tôi đã kiểm tra một tình huống trao đổi dữ liệu phổ biến mà bạn có thể sử dụng các khái niệm mã hóa XML. Tôi cũng đã minh họa các loại mã hóa XML khác nhau: mã hóa một tệp XML hoàn chỉnh, một phần tử của môt tệp XML, hay những nội dung của một phần tửXML. Tôi cũng bàn về giải mã, siêu mã hóa và ứng dụng của các khái niệm mã hóa XML trong các dịch vụ Web dựa trên SOAP.
| Tên | Kích thước | Phương thức tải |
|---|---|---|
| x-encrypt2/x-encrypt2_src.zip | HTTP |
- Hãy đọc "Khám phá Mã hóa XML, Phần 1" trong loạt bài hướng dẫn gồm 2
phần về Mã hóa XML của Bilal Siddiqui (developerworks, Tháng 3,
2002).
- Tải mã trình làm việc hoàn chỉnh cho minh họa này. Mã trình sau
tham khảo trong bài hướng dẫn này được bao gồm:
- Readme.txt chỉ cho bạn cách thiết lập môi trường và chạy bản dùng thử
- demoXmlEncApp.java (ví dụ 1)
- XmlEncryption.java (Ví dụ 2)
- Order.xml (Ví dụ 3)
- AlgoNames.java
- CipherData.java
- EncryptedData.java
- EncryptionMethod.java
- GenericKeyInfo.java
- Transforms.java
- Tìm hiểu W3C XML
Encryption Specification Candidate Recommendation, đây là thứ
mà tôi đã tuân theo trong bài hướng dẫn này.
- Khám phá Business Transaction Protocol (BTP), một kiến trúc linh hoạt
để giao dịch thương mại vẫn đang trong quá trình phát triển.
- Hãy đọc XML Digital
Signature (XML-DSIG), một giao thức được thiết kế để trao đổi
khóa.
- Tìm hiểu Chỉ số SOAP
xác định một giao thức để trao đổi dữ liệu trong một môi trường phân
bổ.
- Tìm kiếm thêm các nguồn XML trên developerWorks XML technology zone.
- Lấy IBM
WebSphere Studio Application Developer, một môi trường phát
triển tích hợp dễ sử dụng để xây dựng, kiểm tra và sử dụng các ứng
dụng J2EE, bao gồm tạo ra các tài liệu XML từ DTDs và các lược
đồ.
- Tìm hiểu cách bạn có thể trở thành một nhà phát
triển có trình độ trong lĩnh vực XML và các công nghệ liên
quan.
Tư vấn viên XML: Bilal Siddiqui đã nhận được bằng Kỹ sư Điện tử của trường Đại học Kỹ sư và Công nghệ, Lahore, Pakistan năm 1995. Sau đó ông bắt đầu thiết kế các giải pháp phần mềm cho các hệ thống quản lý công nghiệp. Và rồi ông lại chuyển sang XML và sử dụng kinh nghiệm lập trình C++ của mình để xây dựng các công cụ xử lý XML dựa vào Web và WAP, các giải pháp phân tích bên cạnh máy chủ, và các ứng dụng dịch vụ. Bạn có thể liên hệ với ông theo địa chỉ wap_monster@yahoo.com.