Xõy dựng cỏc mụ đun ứng dụng và tớnh bảo mật của ứng dụng trong SIM
Xõy dựng cỏc module trờn SIM:
• Module tra cứu tài khoản ngõn hàng • Module tra cứu cước điện thoại • Module thanh toỏn cước phớ • Module trợ giỳp
Để thực hiện bảo mật thụng tin, mỗi ứng dụng trong SIM cần cú một khoỏ riờng được lưu trong một file khúa (file khoỏ này sẽ được tạo trong quỏ trỡnh nạp ứng dụng vào SIM của khỏch hàng đăng ký với một AID xỏc định, tờn file được đặt là EF_keyfile). Cỏc khoỏ được lưu trong cựng tờn AID nhưng giỏ trị khúa khỏc nhau, kốm với khoỏ là một id_key của chớnh khoỏ đú. Cỏc file khúa này được lưu vào một miền truy nhập (Access Domain) của SIM. Miền truy nhập yờu cầu khoỏ để đọc nội dung file, khoỏ này chỉ cú ứng dụng Thanh toỏn điện tử biết đến.Trờn STK Gateway cũng lưu một cơ sở dữ liệu cỏc khoỏ này (bao gồm key và id_key).
Lớp DataCipher thực hiện mó hoỏ, tạo chuỗi Message Digest để xỏc thực tớnh toàn vẹn thụng tin phớa bờn nhận, lớp này thực hiện bảo mật dữ liệu trước đúng gúi bản tin SMS.
class DataCipher {
byte[] encryptData(byte[] input, byte[] output); byte[] getKey();
Cipher getAlgorith();
byte[] createMD(short id_Alg, byte[] input); }
// Mó hoỏ dữ liệu
// Lấy khoỏ trong EF_keyfile // Lựa chọn thuật toỏn // Tạo chuỗi MD
Lớp khai bỏo ConstantValue định nghĩa cỏc hằng số sử dụng cho ứng dụng SIM.
public interface ConstantValue {
static final byte ERR_EXECUTIVE = (byte)0x46; static final byte SERVER_OPERATION = (byte)0x0F; static final byte CMD_QUALIFIER = (byte)0x80;
}
Lớp MainProcess là lớp xử lý chớnh của ứng dụng, thực hiện cỏc chức năng như tạo cõy thực đơn cho ứng dụng, hiển thị cỏc thụng tin hỗ trợ khỏch hàng sử dụng, tạo cỏc giao diện nhập số liệu người dựng, gửi cỏc bản tin SMS lờn mạng thực hiện cỏc yờu cầu tra cứu thụng tin tài khoản ngõn hàng, xem cước thuờ bao di động, yờu cầu thanh toỏn cước qua tài khoản ngõn hàng.
class MainProcess { private short providerID; private short bankID; private byte[] account; private byte[] pinCode; private byte[] currencyCode;
private byte[] msisdn; private byte[] billCycle;
private byte[] chargedMoney; private byte[] keyID; private byte[] smsType;
public void sendSms(byte[] tpduData); public void help();
public short createMenu(object[] itemList); public byte[] getInputData(); }
// Mó nhà cung cấp dịch vụ // Mó ngõn hàng
// Số tài khoản ngõn hàng // Mó PIN ứng với tài khoản trờn // Mó của loại tiền tệ
// Số điện thoại Mobile // Chu kỳ cước
// Số tiền thanh toỏn cước Mobile
// Chỉ ra SMS là yờu cầu tra cứu hay thanh toỏn // Chỉ số của khoỏ trong file key
// Gửi SMS ra STK Gateway // Hiển thị thụng tin hỗ trợ sử dụng // Tạo cõy thực đơn
// Lấy thụng tin nhập
Việc đúng gúi dữ liệu vào SMS với cỏc yờu cầu thanh toỏn cần xỏc định độ dài của bản tin được mó hoỏ, độ dài nờn đảm bảo <160 Byte. Ta hoàn toàn cú thể xỏc định độ dài bản tin gửi đi thụng qua cỏc đặc tớnh:
Với việc sử dụng thuật toỏn của hệ mật mó đối xứng DES, bản tin cần mó hoỏ sẽ được mó hoỏ theo từng khối 8 Byte và kết quả đầu ra cũng cú độ dài bằng độ dài bản tin đầu vào nờn ta cú thể xỏc định được độ dài bản tin sau mó hoỏ.
Với việc tạo bản tin Message Digest, cú nhiều thuật toỏn để tạo cỏc bản tin để đảm bảo tớnh toàn vẹn. Tuỳ theo từng thuật toỏn đầu ra bản tin sau mó hoỏ cú thể là 4 byte, 8 byte hay 16 byte với độ dài bản tin đầu vào bất kỳ. Do đú ta hoàn toàn cú thể xỏc định được độ dài của bản tin trước khi gửi đi.
Thuật toỏn được lựa chọn cho mó hoỏ dữ liệu của ứng dụng là thuật toỏn DES, thuật toỏn được sử dụng tạo MD được chọn là ALG_DES_MAC8_PKCS5 (đầu ra là 8 byte sau khi mó hoỏ).
Với bản tin yờu cầu thanh toỏn, ban đầu providerID, bankID, account, pinCode, currencyCode, msisdn, billCycle, chargedMoney sẽ mó hoỏ theo thuật
toỏn DES, tạo ra chuỗi dataEnc. Sau đú dataEnc sẽ được tạo thành một MD. Sau đú, đúng gúi cỏc thụng tin bao gồm dataEnc, MD, keyID, smsType sẽ được đúng gúi SMS và gửi đi. Với cỏc SMS yờu cầu tra cứu sẽ được phõn biệt bởi tham số smsType.
Cỏc mụ đun của ứng dụng trờn STK Gateway
Lớp SMSProcess thực hiện chức năng nhận cỏc bản tin SMS từ SIM đúng gúi gửi lờn xử lý cỏc thụng tin nhận được như kiểm tra tớnh bảo mật: giải mó, kiểm tra tớnh toàn vẹn thụng qua phương thức compareMD(), getDataEnc() khoỏ sử dụng giải mó được lấy từ cơ sở dữ liệu khoỏ thụng qua keyID nhận được.
class SMSProcess {
String getTypeSMS (String tpduData); String getKeyID (String tpduData); String getDataEnc (String tpduData); String decryptData (String encBuf); String getMD (tpduData); boolean compareMD (String MD); String keyData;
// Lắng nghe bản tin Incoming SMS và xử lý public void PDUProcessor(){}
}
// Xỏc định loại bản tin // Lấy keyID trong SMS // Lấy dữ liệu được mó hoỏ // Giải mó dữ liệu nhận được // Lấy dữ liệu MD
// Thực hiện kiểm tra tớnh toàn vẹn
Lớp giao tiếp này thực hiện gọi cỏc hàm xử lý trờn mỏy chủ Payment Process Center qua giao diện EJB/J2EE. Tuỳ theo cỏc SMS nhận được từ ứng dụng SIM Toolkit là tra cứu thụng tin cước hay yờu cầu thanh toỏn, STK Gateway sẽ gọi cỏc hàm tương ứng trờn để thực hiện. Đồng thời, thụng tin trả lời khi thực hiện giao dịch sẽ được đúng gúi dạng SMS để trả về cho người dựng.
class BankProcess {
// Lệnh lấy thụng tin tài khoản Bank
public AccountInfo getAccountInfo(String bankID, String account, String pinCode); // Lệnh yờu cầu chuyển khoản
public FundTransferInfo transferFund (String bankID, String account, String pinCode, String currencyCode,
String msisdn, Date billCycle, double chargedMoney); } class AccountInfo { String bankID; String account; String pinCode; String fullname; String gender; String address; String idno; String contactNumber; }
class FundTransferInfo { String fromAccount; String toAccount; String currencyCode; Date trxDate; double trxAmount; String trxDescription; Date reqDate; int responseCode; String errorDescription; } class MobileProcess {
// Lệnh lấy thụng tin khỏch hàng Mobile
public MobileInfo getMobiInfo (String msisdn, Date billCycle); // Lệnh cập nhật thụng tin khỏch hàng Mobile
public boolean updateMobiInfo(String msisdn, String pinCode, Date billCycle, double chargedMoney); } class MobileInfo { String msisdn; Date billCycle; double chargedMoney; String fullname; String idno; }