HĐ5 Hệ thống Lấy id của tài khoản
HĐ6 Hệ thống Lấy thông tin đã đăng kí dịch vụ từ cơ sở dữ liệu.
HĐ7 Hệ thống Sinh ra mã xác thực từ thông tin đăng kí của người dùng. HĐ8 Hệ thống Đối chiếu mã xác thực được sinh ra từ hệ thống và mã xác
thực người dùng nhập ở hoạt động 4:
+ Nếu trùng nhau, trả về thông báo xác nhận giao dịch thành công cho người dùng và kết thúc quy trình.
+ Nếu không trùng nhau, yêu cầu người dùng nhập lại mã ở hoạt động 4.
Bảng 3. Mô tả quy trình xác thực giao dịch chuyển tiền
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy 2.5. Biểu đồ ca sử dụng
Từ biểu đồ hoạt động chúng ta sẽ đi xây dựng biểu đồ ca sử dụng với mục đích cung cấp một cái nhìn tổng thể về những gì hệ thống làm và ai sẽ dùng nó. Đưa ra cơ
sở để xác định giao tiếp người - máy với hệ thống. Mô hình hóa các chuỗi hành động
mà hệ thống sẽ thực hiện nhằm cung cấp một kết quả nào đó giúp khách hàng có thể hiểu được và có thể giao tiếp được với hệ thống một cách tổng thể.
Hình 9. Biểu đồ ca sử dụng quy trình đăng ký xác thực
2.5.2. Quy trình hủy đăng ký xác thực
Hình 10. Biểu đồ ca sử dụng quy trình hủy đăng ký xác thực
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy
2.5.3. Quy trình xác thực giao dịch chuyển tiền
Hình 11. Biểu đồ ca sử dụng quy trình xác thực chuyển tiền
TỔNG KẾT CHƯƠNG 2
Trong chương 2 khóa luận đã nêu ra thực trạng sử dụng Mobile Banking hiện nay và đưa ra bài toán cần triển khai, giới thiệu về công cụ sử dụng để giải quyết bài toán, từ đó đi vào phân tích hệ thống và cơ chế hoạt động của công cụ xác thực Google
Authenticator. Việc phân tích được diễn giải từ hệ thống web chung sau đó đi vào các thành phần chức năng cụ thể. Trong phần tiếp theo chương 3, khóa luận sẽ diễn giải cơ chế lập trình tạo nên hệ thống xác thực trên Mobile banking. Diễn giải demo kết quả đạt được và đưa ra đánh giá về hệ thống.
Request:
Bod
y: method String
Nhận 1 trong các giá trị sau {register, unregister, auth]
requestid String
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy
CHƯƠNG 3: LẬP TRÌNH PHÁT TRIỂN, THỬ NGHIỆM DỊCH VỤ WEB XÁC THỰC OTP SỬ DỤNG GOOGLE AUTHENTICATOR TÍCH HỢP
VÀO ỨNG DỤNG MOBILE BANKING
3.1. Cơ chế lập trình dịch vụ web sử dụng trình xác thực GoogleAuthenticator Authenticator
3.1.1. Công cụ sử dụng
Với đề tài đưa ra, môi trường phát triển hệ thống bao gồm các thành phần như sau: - Hệ điều hành: Máy chủ xác thực có thể cài đặt trên hệ điều hành Windows
Server
hoặc hệ điều hành Linux. Để tối ưu nhất, nên xây dựng và cài đặt trên hệ điều hành
Linux vì nó đảm bảo độ bảo mật, tính ổn định và tin cậy cao hơn Windows Server.
- Hệ quản trị cơ sở dữ liệu: MySQL là hệ quản trị cơ sở dữ liệu tự do nguồn
mở phổ
biến nhất thế giới và được các nhà phát triển rất ưa chuộng trong quá trình phát
triển ứng dụng. Vì MySQL là hệ quản trị cơ sở dữ liệu tốc độ cao, ổn định và dễ
sử dụng, có tính khả chuyển, hoạt động trên nhiều hệ điều hành cung cấp một hệ
thống lớn các hàm tiện ích rất mạnh. Với tốc độ và tính bảo mật cao, MySQL rất
thích hợp cho các ứng dụng có truy cập CSDL trên internet.
- Ngôn ngữ lập trình: Như đã đề cập ở mục 2.2, webservice sử dụng ngôn ngữ lập
trình Java. Java là một ngôn ngữ lập trình đa năng mạnh mẽ, đơn giản và dễ học.
Nó được sử dụng để phát triển các ứng dụng máy tính để bàn và thiết bị di động,
Nguyễn Thị Hồng Vân - K19HTTTA
Bo dy: requested String ec String Success = "ũ" Error != "O" em String
Mò tả lỗi khi mã lỗi khác "0"
detail Object
STT Tên trường Kiểu dữ liệu Mô tả
T registerid String ID đăng ký của tài khoản
2 issuer String Tên gợi nhớ
3 type String Tên yêu cầu
STT Tên trường Kiểu dữ liệu Mô tả
T" type String Tên yêu cầu
2 imagebase64 String Ảnh mã QR dưới dạng mã hóa
Base64
Respone:
Tù)' vào mõi gia trị method sẽ có các detail tương ứng
Hình 12. Thiết kế cấu trúc dữ liệu REST API của webservice Đăng ký:
STT Tên trường Kiểu dữ liệu Mô tả
1 registerid String ID của tài khoản muốn hủy đăng ký
2 type String Tên yêu cầu
STT Tên trường Kiểu dữ liệu Mô tả
T" unregisterid String ID của tài khoản đã hủy đăng ký
2 type String Tên yêu cầu
STT Tên trường Kiểu dữ liệu Mô tả
T registerid String ID đăng ký của tài khoản
2 token String Mã xác thực
3 type String Tên yêu cầu
STT Tên trường Kiểu dữ liệu Mô tả
T" type String Tên yêu cầu
2 token String Mã xác thực
Bảng 5. Mô tả respone detail luồng gửi yêu cầu đăng ký
Nguyễn Thị Hồng Vân - K19HTTTA
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy
Hủy đăng ký:
Bảng 6. Mô tả request detail luồng gửi yêu cầu hủy đăng ký
Bảng 7. Mô tả respone detail luồng gửi yêu cầu hủy đăng ký Xác thực:
CATALINAJiOME=S FOJiOMEZtomcat7094
PATH=SPATH:SHOME/bln:SJAVAHOME/bin:SsERvicEMIXJIOMEZbin
JAVAJJPTS=1-Djava.util.prefS.SysceniRoot=ZhomeZfo/.java -Djava-Util.prefs.USerRoot=ZhomeZfo/.java/.UserPrefs -Duser.home=∕home∕foZ -J
export CATALINAHOME export JAVAJIOME export PATH
Bảng 9. Mô tả respone detail luồng xác thực
Nguyễn Thị Hồng Vân - K19HTTTA
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy
3.1.3. Cài đặt chương trình
Trong hướng dẫn cài đặt ở phần này sẽ thực hiện khóa luận hướng dẫn tải và cài đặt trên hệ điều hành linux. Cài đặt trên hệ điều hành Windows cũng bao gồm các bước tương tự.
a, Cài đặt jdk phiên bản 1.7.0_80
- Tải và giải nén file jdk1.7.0_80 trên trang chủ của Oracle tại đường link:
https://www.oracle .com/java/technologie s/javase/javase7-archive- downloads.html.
- Cấu hình jdk tại file/etc/profile, trỏ đường dẫn tới thư mục đã tải và giải nén ở trên.
Hình 13. Cấu hình jdk trên hệ điều hành linux b, Cài đặt Apache Servicemix phiên bản 5-1-2
- Tải và giải nén file apache-servicemix-5.1.2 tại địa chỉ:
https://servicemix.apache.org/downloads/servicemix-5.1.2.html - Cấu hình file/etc/profile, trỏ đường dẫn tới thư mục đã tải và giải nén
servicemix ở trên hình 13 .
c, Triển khai webservice lên servicemix
- Webservice được xây dựng và xuất ra dưới dạng file jar và copy vào thư mục apache-servicemix-5.1.2/lib/ext.
- Sau khi copy file vào thư mục. Tiến hành khởi chạy servicemix bằng cách chạy
file apache-servicemix-5.1.2/bin/servicemix. Servicemix sẽ tiến hành cài đặt webservice xác thực lên hệ thống và thực thi dịch vụ.
3.2. Diễn giải lập trình một số module chính
3.2.1. Nhận request
Khi webservice nhận được request từ phía người dùng. Dữ liệu dưới dạng json
các giá trị vào đối tượng bằng hàm receiveRequest, luồng xử lý tiếp tục gọi vào hàm processEnity để tiến hành kiểm tra request thuộc yêu cầu đăng ký, hủy đăng ký hay là xác thực để gọi vào hàm xử lý tương ứng.
@POST
@Path(Paths.TOTP)
@Produces(MediaType. APPLICATION_JSON)
public Response totpDoPost(String body) {
logger.info("totpDoPost: request: " + body); Response response;
WrapperEnity enity = null;
try { enity = enityFactory.receiveRequest(body); if (!enity.isError()) { processEnity(enity); } } catch (Exception e) { logger.error("", e);
enityFactory.errorResponseEnity(enity, ErrorCodes.INTERNAL_ERROR,
e); }
response = buildResponse(enity);
logger.info("totpDoPost: response: " + enity.getResponse());
return response;
}
public WrapperEnity receiveRequest(String json) {
RequestEnity request;
WrapperEnity enity = new WrapperEnity();
try {
request = mapper.readValue(json, RequestEnity.class);
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy
enity.setRequest(request);
} catch (IOException e) {
logger.error("", e);
errorResponseEnity(enity, ErrorCodes.BAD_REQUEST, e);
return enity;
}
return enity;
}
private void processEnity(WrapperEnity enity) {
String key = enity.getRequest().getMethod(); Route route = routecontroller.getRoute(key);
logger.info("processEnity: getRoute: " + key + " | route: " + route);
route.process(enity); }
3.2.2. Xử lý
a, Đăng ký
Với yêu cầu đăng ký, luồng xử lý sẽ gọi vào hàm process của class RegisterRoute. Hàm process tiến hành lấy ra id và accountname của request đầu vào sau khi đã được truyền vào đối tượng. Luồng xử lý tiếp theo được gọi tới hàm register
và truyền vào id, accountname được lấy từ trên. Hàm register trả về URL chứa thông tin đăng ký gồm khóa bí mật, username và tên gợi nhớ được tạo ra bởi thư viện GoogleAuthenticatorQRGenerator. URL này sau đó được sử dụng để tạo ra mã QR bằng thư viện QrCodeGenerate dưới dạng byte. Mã QR này được chuyển đổi thành dạng chuỗi kí tự mã hóa base64 và trả ra response kèm theo mã secret dưới dạng chuỗi kí tự để người dùng có thể lưu lại mã secret này thuận tiện cho việc đăng ký với điều kiện không thể quét mã QR hoặc sử dụng để backup khi bị thất lạc thiết bị.
public WrapperEnity process(WrapperEnity enity) {
ResponseEnity response = null;
RegisterRequestDetail detail = (RegisterRequestDetail)
request.getDetail();
String id = detail.getRegisterid();
String accountname = detail.getAccountname();
String totpUrl = totpService.register(id, accountname);
if (totpUrl == null){
logger.warn("Cannot register with id: " + id);
enityFactory.errorResponseEnity(enity,
ErrorCodes.BAD_REQUEST, ErrorMessages. REGISTER_FAILED);
} else {
byte[] imageInCenter = null;
byte[] qrCodeImg;
try {
qrCodeImg = qrCodeGenerate.getQrCodeFile(totpUrl, imageInCenter); String imageBase64 = Base64.encodeBase64String(qrCodeImg);
response = enityFactory.successedResponseEnity(enity, request.getMethod()); RegisterResponseDetail responseDetail = (RegisterResponseDetail) response.getDetail(); responseDetail.setImageBase64(imageBase64); responseDetail.setSecretKey(totpRepository.getSecretKey(id)); } catch (Exception e) { logger.error("", e); enityFactory.errorResponseEnity(enity,
ErrorCodes.INTERNAL_ERROR, e);
} }
return enity;
}
public String register(String id, String accountname) {
if (totpVerifier.isExitedId(id) && dataAccess.find(id) != null){
return null; } return GoogleAuthenticatorQRGenerator.getOtpAuthTotpURL(issuer, accountname, totpVerifier.createCredentials(id)); } b, Hủy đăng ký
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy
Với yêu cầu hủy đăng ký, luồng xử lý sẽ gọi vào hàm process của class UnregisterRoute. Hàm process tiến hành lấy ra id của request đầu vào sau khi đã được
truyền vào đối tượng. Sau đó, nó gọi tiếp tới hàm unregister của class TotpService và truyền vào id được lấy ra từ trên. Hàm unregister gọi tới hàm removeId của class TotpVerifier. Luồng xử lý của hàm removeId gọi tới hàm deleteUsername của class TotpRepository. Ở hàm xử lý này, nó sẽ tiến hành xóa dữ liệu được lưu trong bộ nhớ đệm Map của webservice, đồng thời gọi tới hàm xóa dữ liệu được lưu trong CSDL.
public WrapperEnity process(WrapperEnity enity) {
RequestEnity request = enity.getRequest(); logger.info("process: " + request);
UnregisterRequestDetail detail =
(UnregisterRequestDetail) request.getDetail();
String id = detail.getRegisterid();
ResponseEnity response = null;
String unregistedId = totpService.unregister(id);
response = enityFactory.successedResponseEnity(enity, request.getMethod()); UnregisterResponseDetail responseDetail = (UnregisterResponseDetail) response.getDetail(); responseDetail.setUnregistedId(unregistedId); return enity; }
public String unregister(String id) {
totpVerifier.removeId(id);
return id;
}
public void removeId(String id) {
totpRepository.deleteUsername(id); }
public String deleteUsername(String username) {
repo.remove(username);
dataAccess.delete(username);
return username;
c, Xác thực
Với yêu cầu xác thực, luồng xử lý sẽ gọi vào hàm process của class AuthenticateRoute . Hàm process tiến hành lấy ra registered và token của request đầu
vào sau khi đã được truyền vào đối tượng WrapperEnity. Tiếp đến nó gọi tới hàm authenticate của class TotpService. Trong hàm xử lý authenticate, webservice kiểm tra token nhập vào và chuyển nó thành dạng Integer, sau đó nó tiếp tục gọi tới authorizeUser của class TotpVerifier, class này kế thừa interface IGoogleAuthenticator. Tại hàm này, tiếp tục truyền id tài khoản, token và gọi tới authorizeUser của class GoogleAuthenticator - thư viện sinh mã bí mật, xác thực tương đồng trên ứng dụng Google Authenticator. Tại đây, nó sẽ tiến hành kiểm tra id trong kho lưu trữ trên bộ nhớ đệm, nếu tồn tại id kia, nó sẽ tiến hành lấy ra mã secretkey của id và tạo ra một token từ id và secretkey này, sau đó đối chiếu với token
người dùng nhập vào, nếu giống nhau trả về kết quả xác thực thành công, ngược lại trả về kết quả lỗi nếu hai token không khớp với nhau. Trong trường hợp xác thực thành công, nó sẽ kiểm tra trong bộ nhớ tạm Map repoMap có tồn tại id của người dùng này không, nếu tồn tại thì đây là quá trình xác thực lần đầu để hoàn tất đăng ký.
Hẹ thống sẽ tiến hành ghi thông tin người dùng được lưu trong bộ nhớ tạm vào Database qua hàm saveData của class TotpMySQLDatabaseMagager. Sau khi ghi xong, nó tiến hành xóa thông tin người dùng trong bộ nhớ repoMap
public WrapperEnity process(WrapperEnity enity) {
RequestEnity request = enity.getRequest(); logger.info("process: " + request);
ResponseEnity response = null;
AuthenticateRequestDetail detail = (AuthenticateRequestDetail) request.getDetail();
String id = detail.getRegisterid();
String verificationCode = detail.getToken();
String errcode = totpService.authenticate(id, verificationCode);
if(errcode==null){
enityFactory.errorResponseEnity(enity,
ErrorCodes.BAD_REQUEST, ErrorMessages.AUTH_FAILED);
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy
TotpRepository.rẹpoMap.remove(id);
} response = enityFactory.successedResponseEnity(enity, request.getMethod()); AuthenticateResponseDetail responseDetail = (AuthenticateResponseDetail) response.getDetail(); responseDetail.setAuthid(id); responseDetail.setToken(verificationCode); } else if(errcode.equalsIgnoreCase(ErrorCodes.INCORRECT_ANSWER)){ enityFactory.errorResponseEnity(enity,
ErrorCodes.INCORRECT_ANSWER, ErrorMessages.INCORRECT_ANSWER);
}else{
enityFactory.errorResponseEnity(enity,
ErrorCodes.NEXT_TOKEN_REQUIRED, ErrorMessages.NEXT_TOKEN_REQUIRED);
}
return enity;
}
public String authenticate(String id, String verificationCode) {
// TODO Auto-generated method stub
logger.info("verificationCode: " + VerificationCode+ ":: id ::" + id); int VerificationCodeByInteger = 0; try { verificationCodeByInteger = Integer. parseInt(VerificationCode); } catch (NumberFormatException e) {
return ErrorCodes.INCORRECT_ANSWER;
} logger.info("Prepare doValid..."); try { if ( VerificationCodeByInteger != 0 && totpVerifier.authorizeUser(id, verificationCodeByInteger)){
return ErrorCodes.SUCCESS;
}
else{
return ErrorCodes.INCORRECT_ANSWER;
}
} catch (GoogleAuthenticatorException e) {
return ErrorCodes.NEXT-TaKEN-REQUIRED;
} }
@Override
public boolean authorizeUser(String userName, int verificationcode) throws
GoogleAuthenticatorException {
boolean result = gAuth.authorizeUser(userName, VerificationCode);
if (result){
persist(userName, VerificationCode);
return result;
}
@Override
public void saveData(TotpProfile profile) {
// TODO Auto-generated method stub
collection.put(profile.getId(), profile);
try {
Connection connection = getConnection();
String sql = "call save_totp_profile(?, ?, ?, ?)";
CallableStatement cs = connection.prepareCall(sql); cs.setString(1, profile.getId()); cs.setString(2, profile.getSecret()); cs.setInt(3, profile.getValidationCode()); cs.setString(4, profile.getScratchCodes().toString()); cs.execute(); } catch (SQLException e) {
logger.error("ERROR saveData =====> "+e); }
}
3.3. Thử nghiệm ứng dụng
Sau khi cài đặt môi trường, lập trình hệ thống và chạy chương trình ổn định cùng
với việc tích hợp xác thực vào ứng dụng Mobile Banking cụ thể ngân hàng được áp dụng là BaoViet Bank thành công. Hệ thống triển khai thực tế được áp dụng sẽ hoạt động theo mô hình đã thiết kế. Cụ thể giao diện và chức năng như sau:
3.3.1. Đăng ký xác thực
Trước hết khách hàng cần download ứng dụng xác thực này về điện thoại của mình thông qua App Store (đối với hệ điều hành ISO với phiên bản từ 7.0 trở đi), CH
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy ■Il Viettel ∙≈F 11:50 @ ■? 77% M ■ < Tìm kiêm Google Authenticator Google LLC 3,9****ứ #18 4+ 297 xếp hạng Tiện ích Tuổi
Tính năng Lich sử phiên bản
Mới
Phiên bản 3.0.1 1 năm trước
• Hỗ trợ iPhone X • Sửa một sô lỗi nhỏ
Xem trước
Bước 1: Khách hàng nhập thông tin đăng nhập bao gồm Tên đăng nhập và mật khẩu
để truy cập vào ứng dụng. Màn hình giao diện các chức năng hiển thị như hình 15.
Hình 15. Giao diện đăng nhập và menu của app Mobile Banking
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy Bước 2: Để kích hoạt tài khoản sử dụng dịch vụ xác thực TOTP, khách hàng cần
chọn chức năng Đăng kí TOTP. Màn hình hiển thị thông tin giới thiệu về ứng dụng và các bước cần thực hiện.
Hình 16. Giao diện giới thiệu hình thức xác thực TOTP
Bước 3: Khách hàng chọn nút Tiếp tục. Hệ thống hiển thị mã QR code và mã secret
key. Đối với trường hợp khách hàng muốn quét mã QR thì ứng dụng xác thực Google
Authenticator cần cài đặt ở một thiết bị di động khác do ứng dụng chưa có tính năng quét mã trên cùng một thiết bị. Trường hợp cả app Mobile Banking và trình xác thực cùng trên một thiết bị, khách hàng nhấn giữ vào mã được hiển thị thay thế như hình.. mã sẽ được tự động copy và lưu vào bộ nhớ tạm của điện thoại.
Hình 17. Giao diện hiển thị mã QR code và secretkey.
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy Bước 4: Mở ứng dụng Google Authenticator, chọn quét mã QR code hoặc nhập khóa
thiết lập.
Hình 18. Giao diện nhập thông tin trong ứng dụng Google Authenicator.
Sau khi quét mã hoặc nhập mã khóa trên ứng dụng Google Authenticator sẽ hiển thị Account Name cùng mã TOTP như hình 19.
Hình 19. Giao diện hiển thị mã TOTP của ứng dụng đã đăng kí dịch vụ xác thực
Khóa luận tốt nghiệp GVHD: Ths. Nguyễn Thanh Thụy Bước 5: Khách hàng nhấn nút Tiếp tục tại bước 4, hệ thống yêu cầu nhập mã xác
thực đã được hiển thị trên ứng dụng Google Authenticator. Nếu nhập mã không