Các công tyđối thủ cạnh tranh trực tiếp luôn tìm cách đánh cắp mã nguồn, lấy được thuật toán và các dữ liệu quan trọng để cài tiến, xây dựng sản phẩm của riêng họ vượt trội hơn.Chính vì
Trang 1LỜI MỞ ĐẦU
Hiện nay lĩnh vực công nghệ phần mềm phát triển hết sức mạnh mẽ, các sảnphẩm phần mềm xuất hiện ở mọi ngành nghề từ y tế bệnh viện, tài chính ngân hàngđến giáo dục hay các cơ quan nhà nước Mỗi sản phẩm phần mềm đều chứa đựngnhững thuật toán cốt yếu, những dữ liệu nhạy cảm tối quan trọng phản ảnh giá trịcủa phần mềm đó, đem lại sự cạnh tranh tốt so với các sản phẩm phần mềm tương
tự Ví dụ như trong bộ phần mềm kế toán Misa, các quy trình nghiệp vụ được tíchhợp trong đó cùng với các thuật toán xử lý dữ liệu một cách nhanh và ổn định nhất,hay như máy tìm kiếm của google với các thuật toán tìm kiếm dữ liệu nhanh nhất,
… Mỗi sản phẩm đó đã khẳng định vị thế vượt trội của nó trong từng lĩnh vựctương ứng cũng chính nhờ các thuật toán cốt lõi được cài đặt trong đó Các công tyđối thủ cạnh tranh trực tiếp luôn tìm cách đánh cắp mã nguồn, lấy được thuật toán
và các dữ liệu quan trọng để cài tiến, xây dựng sản phẩm của riêng họ vượt trội hơn.Chính vì thế vấn đề bảo vệ mã nguồn ứng dụng tránh sự đánh cắp, dịch ngược thuđược mã nguồn và các dữ liệu quan trọng là một bài toán hết sức cấp thiết và có ýnghĩa thực tiễn cao trong thời đại bùng nổ của công nghệ thông tin hiện nay
Trong phát triển phầm mềm hiện nay, Java là một môi trường mạnh mẽ đối vớicác công ty, các nhà phát triển phần mềm Tuy nhiên, với ngôn ngữ lập trình javacác ứng dụng rất dễ bị tấn công dịch ngược mã nguồn vì java là một ngôn ngữ cótính cấu trúc rõ ràng, định dạng bytecode của ứng dụng hàm chứa nhiều thông tinquan trọng phục vụ cho quá trình thông dịch của máy ảo java Trong báo cáo này,chúng tôi đã đưa ra hai giải pháp nhằm ngăn chặn quá trình tấn công đánh cắp mãnguồn đối với các ứng dụng java Ở giải pháp thứ nhất, chúng tôi sẽ cài đặt cácthuật toán cũng như dữ liệu nhạy cảm được đặt trên server và chia sẻ cho ứng dụngphía người dùng dưới dạng các dịch vụ Phần mềm ứng dụng phía người dùng thựchiện các tính toán thông qua việc gọi đến các dịch vụ trên máy server Khi đó, cácthành phần dữ liệu nhạy cảm cũng như các thuật toán cốt lõi của ứng dụng đượcquản lý tập trung trên server nên ứng dụng nếu bị dịch ngược mã nguồn cũng không
bị lỗ các thuật toán, dữ liệu quan trọng đó Trong giải pháp thứ hai, chúng tôi thựchiện xáo trộn mã nguồn ứng dụng với kỹ thuật Obfuscation Khi đó, nếu có bị dịch
Trang 2ngược thì kẻ tấn công cũng chỉ thu được mã nguồn rất hỗn độn, rất khó đọc và rấtkhác biệt với mã nguồn gốc nên các thuật toán hay dữ liệu của ứng dụng cũng đượcche giấu.
Trong báo cáo này, chúng tôi trình bày những nội dung đã nghiên cứu và các kếtquả đạt được của nhóm đề tài trong 3 chương:
Chương 1: Nguy cơ bị lộ mã nguồn chương trình java Trong chương này,
chúng tôi chỉ ra quá trình phát triển một ứng dụng java từ viết code đến biên dịch vàthông dịch chương trình đó Sau đó chúng tôi phân tích nguy cơ khiến ứng dụngjava có thể bị lộ mã nguồn
Chương 2: Kỹ thuật dịch ngược mã nguồn Chương này trình bày rõ cơ sở của
việc dịch ngược một chương trình java và cách thức thực hiện để dịch ngượcchương trình từ mã bytecode của ứng dụng thông qua các công cụ dịch ngược
Chương 3: Nghiên cứu kỹ thuật bảo vệ mã nguồn ứng dụng Java Trong đó,
nhóm đề tài trình bày hai giải pháp thực hiện việc bảo vệ chống bị lộ mã nguồn.Trong quá trình thực hiện đề tài, nhóm chúng tôi đã cố gắng và làm việc nghiêmtúc khoa học Tuy nhiên, do hạn chế về thời gian cũng như kiến thức về vấn đề nàycùng với sự phát triển mạnh mẽ của công nghệ nên không tránh khỏi những thiếusót, hạn chế Chúng tôi rất mong nhận được sự đóng góp của các nhà khoa học, cáccấp quản lý cùng đồng nghiệp để chỉnh sửa bổ sung và hoàn thiện hơn nữa
Chúng tôi xin chân thành cảm ơn Ban giám đốc, phòng Quản lý NCKH, khoaCông nghệ thông tin, các phòng chức năng – Học viện Kỹ thuật Mật mã và các bạnđồng nghiệp đã tạo điều kiện thuận lợi cho việc nghiên cứu và hoàn thiện đề tài này
Hà Nội, tháng 11/2013
2
Trang 3CHƯƠNG 1: NGUY CƠ BỊ LỘ MÃ
NGUỒN CHƯƠNG TRÌNH JAVA
1 Môi trường và quá trình biên dịch một chương trình Java
Java là một ngôn ngữ lập trình hướng đối tượng được đưa ra bởi SunMicroSysem Mỗi chương trình được viết bằng ngôn ngữ java có thể chạy trên bất
kỳ một hệ thống nào có cài máy ảo Java (Java Virtual Machine)
Tất cả các chương trình muốn thực thi được thì phải được biên dịch ra mãmáy Mã máy của từng kiến trúc CPU của mỗi máy tính là khác nhau (tập lệnh
mã máy của CPU Intel, CPU Solarix, CPU Macintosh … là khác nhau), vì vậytrước đây một chương trình sau khi được biên dịch xong chỉ có thể chạy đượctrên một kiến trúc CPU cụ thể nào đó Đối với CPU Intel chúng ta có thể chạy các
hệ điều hành như Microsoft Windows, Unix, Linux, OS/2, … Chương trình thựcthi được trên Windows được biên dịch dưới dạng file có đuôi EXE còn trênLinux thì được biên dịch dưới dạng file có đuôi ELF, vì vậy trước đây mộtchương trình chạy được trên Windows muốn chạy được trên hệ điều hành khácnhư Linux chẳng hạn thì phải chỉnh sửa và biên dịch lại Ngôn ngữ lập trìnhJava ra đời, nhờ vào máy ảo Java mà khó khăn nêu trên đã được khắc phục Mộtchương trình viết bằng ngôn ngữ lập trình Java sẽ được biên dịch ra mã của máy
ảo java (mã java bytecode) Sau đó máy ảo Java chịu trách nhiệm chuyển mãjava bytecode thành mã máy tương ứng Sun Microsystem chịu trách nhiệm pháttriển các máy ảo Java chạy trên các hệ điều hành trên các kiến trúc CPU khácnhau
Quá trình thông dịch:
Java là một ngôn ngữ lập trình vừa biên dịch vừa thông dịch Chương trìnhnguồn viết bằng ngôn ngữ lập trình Java có đuôi *.java Trước tiên, tập tin Java(chứa mã nguồn java) được biên dịch thành tập tin có đuôi *.class (chứa mãbytecode – định dạng sau khi biên dịch từ mã nguồn) và sau đó sẽ được trình thôngdịch thông dịch thành mã máy tương ứng với nền tảng cài đặt máy ảo Java
Trang 4Dịch và chạy một chương trình Java:
Giả sử chúng ta có đoạn mã sau:
/*Viết chương trình in dòng HelloWorld lên màn hình Console*/
class HelloWorldApp{
public static void main(String[] args){
//In dong chu “HelloWorld”
System.out.println(“Hello World!!!”);
}
}
Lưu lại với tên HelloWorldApp.java sau đó tiến hành dịch và chạy như sau:
- Mở cửa sổ Command Prompt
- Chuyển đến thư mục chứa file java
- Gọi lệnh javac để compile mã nguồn thành mã bytecode: javac
HelloworldApp.java
- Gọi lệnh java để thực thi chương trình: java HelloworldApp
2 Nguy cơ bị lộ mã nguồn chương trình Java
Trong phát triển phần mềm, java là một môi trường mạnh để xây dựng các ứngdụng Với ngôn ngữ java chúng ta có thể phát triển rất nhiều loại ứng dụng như:applet (để nhúng trên các trang HTML), ứng dụng console (chạy dưới dạng màn
4
Trang 5hình console), ứng dụng đồ họa người dùng (application GUI), các applet (cácchương trình web server) hay các ứng dụng chạy trên điện thoại di động (J2ME), …Trong mỗi ứng dụng có thể chứa rất nhiều các thuật toán quan trọng là mấu chốt, làchìa khóa thành công của phần mềm Khi đó các công ty đối thủ cạnh tranh luônluôn mong muốn nắm bắt được những thuật toán cốt lõi trong phần mềm đó, vì vậy
họ sẽ tìm cách lấy được mã nguồn chương trình Hơn thế nữa, trong các ứng dụngngoài thuật toán còn có những phần dữ liệu hết sức quan trọng (ví dụ như thông tintruy cập vào server data, hay các resource bên trong ứng dụng, …) Việc có đượcnhững dữ liệu đó cũng rất hữu ích đối với các công ty đối thủ Vậy để có đượcnhững thuật toán, những dữ liệu quan trọng đó thì họ phải làm thế nào? Một cáchthức hữu hiệu nhất là dịch ngược ứng dụng để thu được mã nguồn, và từ đó họ sẽ cóđược những gì mình cần
Một ứng dụng được viết bằng Java, khi chuyển giao ứng dụng cho khách hàng sẽchuyển cho họ các file sau khi được biên dịch từ mã nguồn java thành mã bytecode(các file có đuôi class) Ứng dụng sẽ được thông dịch thành mã máy thích hợp đểđược thực thi thông qua máy ảo Java (Java Virtual Machine – JVM) được cài đặttrên máy người dùng Các file class này hoàn toàn được che giấu đối với ngườidùng, họ không thể đọc hiểu được những file đã được biên dịch này Tuy nhiên, với
sự trợ giúp của các công cụ dịch ngược hiện nay (decompiler tools) thì chúng tahoàn toàn có thể dịch ngược từ mã bytecode thành mã nguồn java như ban đầu.Giả sử chúng ta có một chương trình java đơn giản như sau:
InputStream f = new FileInputStream("filedemo.txt");
System.out.println("Bytes available to read:"+ (size = f.available()));char str[] = new char[300];
for(int count = 0;count < size;count++){
Trang 6str[count] = ((char)f.read());
System.out.print(str[count]);
} System.out.println("");
f.close();
}
}
Lưu lại thành file Demo.java
Biên dịch file Demo.java ta thu được file Demo.class là file chữa mã bytecodecủa chương trình, bằng câu lệnh sau: javac Demo.java
Sử dụng công cụ dịch ngược Java decompiler ta sẽ thu được kết quả như sau:
Như vậy bằng kỹ thuật dịch ngược ta hoàn toàn có thể thu được mã nguồnchương trình, từ đó nắm bắt được các thuật toán cũng như dữ liệu của ứng dụng.Hiện nay có rất nhiều công cụ hỗ trợ việc dịch ngược mã nguồn ứng dụng từ mã
6
Trang 7bytecode Java decompiler là một tool dịch ngược gọn nhẹ và hoàn toàn miễn phírất phổ biến trong lĩnh vực này Với công cụ này chúng ta có thể thực hiện dịchngược một ứng dụng với cấu trúc các package phức tạp, kết quả thu được gần nhưtương đồng với mã nguồn gốc của ứng dụng.
Trang 8CHƯƠNG 2: KỸ THUẬT DỊCH NGƯỢC
MÃ NGUỒN CHƯƠNG TRÌNH JAVA
1 Cơ sở việc dịch ngược
Trong một môi trường lý tưởng, việc dịch ngược mã nguồn là không cần thiết,ngay cả khi những nhà phát triển phần mềm không có ý thức làm tốt tài liệu thiết
kế Tuy nhiên trong thực tế có một số trường tình huống thì việc dịch ngược là hếtsức cần thiết và hữu dụng:
Khôi phục lại mã nguồn chẳng may bị mất
Muốn học cách cài đặt của một thuật toán đặc trưng hay một bí quyết nàođó
Khắc phục những sự cố, lỗi của một ứng dụng hay một thư viện mà nókhông có tài liệu thiết kế tốt
Khắc phục những lỗi khẩn cấp trong mã nguồn của bên thứ ba mà trongtay không có mã nguồn đó
Học cách bảo vệ mã nguồn để tránh bị đánh cắp
Việc dịch ngược sẽ mang lại mã nguồn chương trình từ mã bytecode Đây là quátrình đảo ngược của quá trình biên dịch, quá trình này thực hiện được bởi mãbytecode có cấu trúc khá chuẩn và có tài liệu đặc tả tốt Ngôn ngữ Java được thiết
kế với khả năng thực thi một cách linh hoạt và thông minh Mã nguồn chương trìnhđược biên dịch sang một định dạng bytecode – độc lập với mọi nền tảng, tức là nó
có thể thực thi trên bất kỳ một nền tảng nào, một máy tính nào mà không cần viếtlại mã nguồn, cũng không cần chuyển đổi mã bytecode, mã bytecode được lưu trữtrong các class file Mã bytecode là một biểu diễn trung gian của mã nguồn chươngtrình và không được mã hóa cho bất kì một nền tảng xác định nào Tức là, trình biêndịch không thể tối ưu hóa mã nguồn cho một phần cứng xác định, mã bytecode phảiđược thông dịch sang mã máy để thực thi và các thông tin mức cao phải được đínhkèm với mã nguồn để phục vụ cho quá trình thông dịch
Trong Java, quá trình thông dịch được thực hiện bởi máy ảo Java (Java VirtualMachine – JVM) JVM là một máy trừu tượng, nó có thể hiểu và thực thi mã
8
Trang 9bytecode trong một máy thật JVM phải thực thi được trên bất kỳ một nền tảng nào
mà người dùng muốn chạy chương trình Java trên đó, do vậy nó phải được đặc tảmột cách dễ hiểu
Java bytecode được mã hóa một cách đơn giản, không tối ưu, chứa đựng nhiềuthông tin mức cao Việc lưu giữ những thông tin mức cao để cho quá trình thực thi
mã bytecode bởi các máy tính khác nhau, các nền tảng khác nhau nên định dạng củaclass file là đơn giản, khá rõ ràng, ít che giấu đối với các nền tảng Mã bytecodekhông được tối ưu nên nó được biểu diễn đơn giản hơn, rõ ràng hơn Mã bytecodeđộc lập kiến trúc, chứa nhiều thông tin về mã nguồn Do đó, từ mã bytecode chúng
ta dễ dàng dịch ngược được thành mã nguồn java ban đầu
2 Dịch ngược một chương trình Java
Xuất phát từ những tình huống cần có được mã nguồn từ mã bytecode như đãnêu trong phần 1, những nhà phát triển môi trường Java cũng đã cung cấp một công
cụ dịch ngược mã nguồn, có tên là javap được cài đặt sẵn trong bộ JDK (JavaDevelopment Kit) của Java
Cú pháp: javap [options] tên_lớp
Trong đó: options là các tùy chọn của lệnh javap, ví dụ:
help: hiển thị các thông báo hỗ trợ sử dụng lệnh javap
public: hiển thị các lớp, các thành phần là public
protected: hiển thị các lớp, các thành phần là protected
p: hiển thị tất cả các lớp, các thành phần
Giả sử chúng ta có một chương trình Java thực hiện việc hiển thị một dòng chữlên màn hình, HelloworldApp.java như sau:
public class HelloWorldApp {
public static void main(String[] args) {
// TODO code application logic here
System.out.println(" Hello world!!!");
}
}
Trang 10Sau khi biên dịch ta thu được file HelloworldApp.class chứa mã bytecode củachương trình Đây là định dạng không đọc được như mã nguồn thông thường, nó sẽđược thông dịch sang mã máy bởi máy ảo java (JVM).
Sử dụng lệnh javap dịch ngược mã bytecode ta thu được mã nguồn chương trìnhnhư sau:
10
Trang 11Mã nguồn thu được ở trên về cơ bản đã phản ánh được các thành phần trong mộtlớp và một phần mã bytecode các câu lệnh của từng phương thức Từ mã bytecode
ở trên người ta có thể dựng lại được mã nguồn hoàn chỉnh của chương trình javagốc Hiện nay có rất nhiều công cụ thương mại cũng như miễn phí, cho phép dịchngược mã nguồn hoàn chỉnh Tiêu biểu là hai công cụ hoàn toàn miễn phí như JAD
và JODE Các công cụ này chính là sự phát triển từ công cụ cơ sở javap như đãtrình bày ở trên bằng cách phân tích thông tin từ mã bytecode để dựng ngược mãnguồn hoàn chỉnh của chương trình
Giả sử chúng ta có một ứng dụng java J2ME thực hiện tính toán và hiển thị lịch
âm – dương, trong đó có phương thức convertSolar2Lunar chuyển đổi ngày dương
lịch sang ngày âm lịch, có mã nguồn gốc như sau:
public static int[] convertSolar2Lunar(int dd, int mm, int yy, double timeZone) { int lunarDay, lunarMonth, lunarYear, lunarLeap;
int dayNumber = jdFromDate(dd, mm, yy);
lunarDay = dayNumber - monthStart + 1;
int diff = INT((monthStart - a11) / 29);
lunarLeap = 0;
lunarMonth = diff + 11;
Trang 1212
Trang 13Dưới đây là mã nguồn của method convertSolar2Lunar sau khi dịch ngược từ mãbytecode của ứng dụng.
public static int[] convertSolar2Lunar(int dd, int mm, int yy, double timeZone) {
int dayNumber = jdFromDate(dd, mm, yy);
int k = INT((dayNumber - 2415021.0769986948D) / 29.530588853000001D); int monthStart = getNewMoonDay(k + 1, timeZone);
int lunarYear = yy;
a11 = getLunarMonth11(yy - 1, timeZone);
} else {
lunarYear = yy + 1;
b11 = getLunarMonth11(yy + 1, timeZone);
}
int lunarDay = dayNumber - monthStart + 1;
int diff = INT((monthStart - a11) / 29);
Trang 14Vấn đề bảo vệ mã nguồn chống việc lấy cắp mã nguồn hay thay đổi mã nguồn làđiều rất có ý nghĩa Việc dịch ngược đối với chương trình Java là không thể ngăncản, tuy nhiên chúng ta có thể sử dụng kỹ thuật rối mã để sau khi dịch ngược cũngkhông thể có được mã nguồn gốc Chương 3 sẽ trình bày chi tiết về kỹ thuật rối mã(Obfuscation techniques).
14
Trang 15CHƯƠNG 3: NGHIÊN CỨU KỸ THUẬT BẢO VỆ MÃ NGUỒN ỨNG DỤNG JAVA
1 Sử dụng kiến trúc hướng dịch vụ
Trong phát triển phần mềm ứng dụng hay các website, mỗi sản phẩm thườngchứa đựng rất nhiều thuật toán quan trọng tạo nên tính nổi trội của sản phẩm, manglại tính cạnh tranh cao so với các sản phẩm tương tự Chính vì vậy việc bảo vệ mãnguồn chống sự đánh cắp trở nên hết sức cấp thiết đối với mỗi công ty sản xuấtphần mềm
Mỗi ứng dụng Java sẽ được biên dịch sang mã bytecode (được chứa trong cácfile class) trước khi chúng được thông dịch sang mã máy để thực thi Như đã đềcập trong chương 2, ứng dụng java ở dạng mã bytecode rất dễ dàng để dịch ngược
để thu được mã nguồn Chính vì vậy, trong chương này chúng tôi sẽ trình bày một
số kỹ thuật để bảo vệ mã nguồn ứng dụng Java Một phương pháp khá đơn giảnnhưng mang lại hiệu quả cao, đó là triển khai các thuật toán dưới dạng các dịch vụ(services) Khi đó các thuật toán cũng như các thành phần quan trọng sẽ được triểnkhai tập trung trên server do chúng ta quản lý và sẽ cung cấp dưới dạng dịch vụ màcác ứng dụng của khách hàng (trên máy client) yêu cầu
Calculate service
ServerServer
Request
Response
SalaryCal
App Client
Trang 16Với mô hình trên, các nhà phát triển phần mềm chỉ bàn giao cho khách hàngchương trình ứng dụng chạy phía client mà trong ứng dụng đó không chứa nhữngthành phần quan trọng, các thuật toán mấu chốt vì chúng được triển khai trên máyserver mà chúng ta quản lý Giải pháp này hoàn toàn che giấu được mã nguồn quantrọng, tránh được nguy cơ đánh cắp mã nguồn Tuy nhiên, với giải pháp này ứngdụng cần có môi trường internet để sử dụng được dịch vụ (service) mà server cungcấp.
Trong mô hình triển khai ở trên chúng tôi trình bày hai kỹ thuật trong java là sửdụng webservice – một thể hiện của service sử dụng các chuẩn giao thức web đểgiao tiếp và rmi (remote method invocation) – thủ tục gọi phương thức đầu xa thôngqua socket TCP
1.1 Triển khai qua web service
1.1.1 Kiến trúc web service
Mô hình kiến trúc của web service gồm 3 thành phần: web service provider, webservice broker và web service requester
Service provider: Sử dụng Web Services Description Language (WSDL) để
mô tả dịch vụ mà mình có thể cung cấp cho Service Broker
Service broker: Lưu trữ thông tin về các service được cung cấp bởi cácService Provider Cung cấp chức năng tìm kiếm hỗ trợ Service Requestertrong việc xác định Service Provider phù hợp Thành phần chính của ServiceBroker là Universal Discovery, Description, and Integration (UDDI)
16
Trang 17 Service Requester: Dùng WSDL để đặc tả nhu cầu sử dụng (loại service, thờigian sử dụng, resource cần thiết, mức giá ) và gửi cho Service Broker Bằngviệc sử dụng UDDI và chức năng tìm kiếm của Service Broker, ServiceRequester có thể tìm thấy Service Provider thích hợp Ngay sau đó, giữaService Requester và Service Provider thiết lập kênh giao tiếp sử dụng SOAP
để trao đổi thông tin trong việc sử dụng service
Khi muốn sử dụng một web service nào đó, application client sẽ truy vấn đếnUDDI để xác định web service cần tìm dựa vào thông tin nào đó như tên, loạiservice Khi đã xác định được web service cần cho ứng dụng, client lấy thông tin vềđịa chỉ WSDL của web service này dựa trên UDDI Tài liệu WSDL này sẽ mô tảcách thức liên lạc với web service, định dạng gói truy vấn và phản hồi Dựa vàonhững thông tin này client sẽ tạo những gói tin SOAP để liên lạc với serviceprovider
Trong mô hình hoạt động của web service, các thành phần trao đổi với nhau dựatrên các giao thức của web service là SOAP và WSDL mà bản chất của chúng là cácgói tin định dạng XML
1.1.2 Web Service Description Language – WSDL
WSDL được sử dụng để mô tả chức năng, interface giao tiếp của một webservice theo cú pháp tổng quát của XML Việc đặc tả này bao gồm các thông tinnhư: tên dịch vụ, giao thức sử dụng khi gọi các hàm của dịch vụ web, loại thông tin(tham số, kiểu dữ liệu, giao diện truy xuất dịch vụ web, …) Hình dưới mô tả chitiết các thành phần được mô tả trong WSDL
Trang 18 Services: Chứa các method có thể được sử dụng thông qua các web protocol.
Ports: Địa chỉ dùng để kết nối đến web service Thông thường, ports được mô
Element: Được định nghĩa trong Types Mỗi element có một name duy nhất
và kiểu dữ liệu Element được dùng để đặc tả dữ liệu dùng trong message.Element có thể đặc tả các dữ liệu đơn giản (string, integer) hay phức tạp hơnnhư array, struct,
XSD file: Các element thường được định nghĩa trong các XML SchemaDefinition (XSD) file XSD file có thể ở trong cùng file WSDL hoặc ở fileriêng biệt
WSDL thường được dùng kết hợp với XML schema và SOAP để cung cấp dịch
vụ web qua internet Một client khi kết nối đến web service có thể đọc WSDL đểxác định các chức năng được cung cấp trong web service đó và từ đó dựa vàoSOAP lấy ra chính xác chức năng cần thiết cung cấp bởi web service đó
1.1.3 Simple Object Access Protocol – SOAP
SOAP là một protocol giao tiếp dùng trong Web service được xây dựng dựa trênXML SOAP được sử dụng để đặc tả và trao đổi thông tin về các cấu trúc dữ liệucũng như các kiểu dữ liệu giữa các thành phần trong hệ thống
Sử dụng SOAP, ứng dụng có thể yêu cầu thực thi method trên máy tính ở xa màkhông cần quan tâm đến chi tiết về platform cũng như các phần mềm trên máy tínhđó
18
Trang 19Hình vẽ dưới đây mô tả giao tiếp của một ứnng dụng với một web service đượcthực hiện qua thông điệp SOAP sử dụng network protocol HTTP Ứng dụng sẽ đặc
tả yêu cầu trong SOAP message và thông qua network protocol gởi đến cho webservice Web service sẽ nhận và phân tích yêu cầu sau đó trả về kết quả thích hợp
Hình vẽ dưới mô tả cấu trúc của một thông điệp SOAP Một thông điệp SOAP baogồm các thành phần sau:
Protocol Header: Cho biết thông tin về các chuẩn giao thức được sử dụng
SOAP Envelop: Thông tin chính của message bao gồm:
o SOAP Header
o SOAP body: Thông tin về name và data được đặc tả dướidạng XML Ngoài ra còn có trường lỗi được dùng để gửi cácweb service exception
Trang 20Dưới đây là chương trình demo việc triển khai một ứng dụng với web service.Chương trình ứng dụng phía client là một form nhập thông tin cần thiết để thực hiệnviệc tính lương nhân viên trong tháng Sau khi nhập đầy đủ thông tin, người dùng
click button Get Salary thì phía client sẽ tạo một SOAP request message với định
dạng được chỉ ra như ở dưới
20
Cấu trúc của toàn bộ SOAP messageChứa các giao thức chuẩn (HTTP,SMTP) và SOAP header
Trang 21Gói tin SOAP request đóng gói các thông tin về số ngày làm việc thực tế, hệ sốlương, lương cơ bản, phụ cấp, số ngày phải làm và phụ cấp Gói tin SOAP được gửiđến server để web service thực hiện phân tích gói tin lấy các tham số đầu vào cungcấp cho phương thức Get_Salary được cài đặt trên máy server, thực hiện tính toántrả về giá trị lương thực lĩnh Thông tin kết quả sẽ được đóng gói trong gói tinSOAP response theo định dạng bên dưới để gửi về cho client phân tích và hiển thịkết quả.