Mô tả lịch sử giao dịch

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu vấn đề xác thực giao dịch ngân hàng trực tuyến sử dụng mật khẩu dạng OTP (Trang 64 - 74)

Phần mềm bên server được xây dựng dưới dạng web server. Phía server dựa vào OTP đã gửi tới di động người dùng để đưa ra quyết định cho phép người dùng thanh toán hay từ chối yêu cầu này. Phần mềm này tương tác với cơ sở dữ liệu lưu thông tin của người dùng cũng như tài khoản của họ. Chương trình sử dụng một gmail mô phỏng một tổng đài để gửi tin nhắn chứa OTP.

Kết luận

Trong chương này, chúng ta đã tiến hành xây dựng và thử nghiệm chương trình thử nghiệm về xác thực giao dịch ngân hàng trực tuyến sử dụng OTP chuyển giao qua gmail. Phương pháp sinh và chuyển giao OTP được cài đặt có khả năng cung cấp tính bảo mật cao cho xác thực giao dịch trực tuyến. Các ứng dụng này có khả năng triển khai rộng rãi trong thực tế do khơng địi hỏi bổ sung phần cứng hay phần mềm phức tạp.

KẾT LUẬN

Mật khẩu sử dụng một lần (OTP) là mật khẩu chỉ được sử dụng một lần duy nhất để xác thực một giao dịch hoặc một phiên làm việc. Do OTP chỉ được sử dụng một lần nên có độ an tồn cao hơn so với mật khẩu truyền thống, tránh được các dạng tấn công như nghe lén. Luận văn nghiên cứu về mật khẩu sử dụng một lần, các kỹ thuật sinh và chuyển giao mật khẩu một lần và ứng dụng vào xác thực các giao thức trực tuyến ứng dụng tại các ngân hàng. Các kết quả chính của luận văn:

+ Nghiên cứu tổng quan về mật khẩu sử dụng một lần và ứng dụng của mật khẩu sử dụng một lần.

+ Nghiên cứu các phương pháp sinh mật khẩu sử dụng một lần dựa trên thời gian, dựa trên thuật toán; phương pháp sinh mật khẩu bằng Token và điện thoại di động; các phương pháp chuyển giao mật khẩu sử dụng một lần bằng giấy, bằng tin nhắn SMS.

+ Nghiên cứu các ứng dụng của OTP trong các giao dịch ngân hàng trực tuyến tại Việt Nam, cài đặt thử nghiệm mô phỏng phương pháp chuyển giao OTP thông qua tin nhắn gmail và sinh OTP trên nền ngôn ngữ Java.

Hướng phát triển tiếp theo của luận văn:

+ Cài đặt và thử nghiệm thành công ứng dụng mật khẩu sử dụng một lần trong xác thực giao dịch ngân hàng trực tuyến sử dụng phương pháp chuyển giao OTP thông qua tin nhắn SMS và sinh OTP.

+ Nghiên cứu về đăng nhập một lần sử dụng mật khẩu sử dụng một lần; + Cải tiến ứng dụng sinh OTP trên điện thoại di động về giao diện và tính năng để việc xác thực người dùng trở nên thân thiện, tiện lợi và đảm bảo độ an toàn cao hơn.

TÀI LIỆU THAM KHẢO

[1]. D. M’Raihi, J. Rydell, S. Bajaj, S. Machani, D. Naccache, OATH Challenge-

Response Algorithm, June 2011.

[2]. D. M’Raihi, J. Rydell, S. Bajaj, S. Machani, D. Naccache, Time-Based One-

Time Password Algorithm, May 2011.

[3]. Neil M. Haller, Bellcore, Morristown, New Jersey - THE S-KEY ONE-TIME PASSWORD SYSTEM, 2011

[4]. One Time Password http://en.wikipedia.org/wiki/One-time_password, 9/2013 [5]. Challenge-Response Algorithm

http://en.wikipedia.org/wiki/Challenge%E2%80%93response_authentication, 9/2013

[6]. Dương Hoàng Anh, Nguyễn Việt Huy, Nguyễn Văn Tân, Phạm Minh Tú - Báo cáo nghiên cứu khoa học: Nghiên cứu về mật khẩu sử dụng một lần và ứng dụng, 12/2012.

[7]. Phạm Tuấn Dũng - Luận văn: Nghiên cứu phương pháp bảo mật cho cơ chế

đăng nhập một lần ứng dụng trong hệ phân tán, 2011.

[8]. Vũ Vinh Quang, Nguyễn Đình Dũng, Nguyễn Hiền Trinh, Dương Thị Mai Thương, Giáo trình lý thuyết thơng tin, Nhà xuất bản Khoa học Kĩ thuật, năm 2010.

PHỤ LỤC

Một số chương trình nguồn

1. Modun Log in to Admin Panel

<head> <script type="text/javascript"> function btnLogin_Click() { document.forms["frmLogin"].action = "checklogin.jsp"; document.forms["frmLogin"].submit(); } function handleKeyPress(evt) { var nbr, chr; if (window.Event) nbr = evt.which; else nbr = event.keyCode; if (nbr == 13) { btnLogin_Click(); document.FORMNAME.submit(); } return true; } document.onkeydown = handleKeyPress </script> </head>

<body id="page-login" onLoad="avaload()"> <div class="login-container">

<div class="login-box">

<form onsubmit="return checkValues()" method="post" action="" name="frmLogin" id="loginForm">

<div class="login-form"><input name="form_key" type="hidden" value="" />

<h2>Log in to Admin Panel</h2> <div id="messages">

</div>

<div class="input-box input-left"><label for="username">User Name: </label><br/>

<input type="text" id="username" name="txtLogin" value="" class="required-entry input-text" /></div>

<div class="input-box input-right"><label for="login">Password: </label><br />

<input type="password" id="login" name="txtPassword" class="required-entry input-text" value="" /></div>

<div class="clear"> </div>

<div class="form-buttons">

<input type="button" class="form-button" value="Login" title="Login" onclick="return btnLogin_Click()" /></div>

</div>

<p class="legal">Demo OTP - One time password For Bank.</p> </form>

<div class="bottom"></div> </div>

</div> </body>

1. Modun chuyển khoản

<body>

<tr>

<td> </td> </tr>

<td><jsp:include page="menutop.jsp" flush="true" ></jsp:include></td> <tr>

<td><!-- InstanceBeginEditable name="noi dung" --> <%

boolean send = false; int tienchuyen = 0;

boolean giaodichthanhcong = false; boolean xacnhanthanhcong = false; boolean xacnhanroi = false;

String code = "";

String userid = (String) session.getAttribute("userid"); String email = (String) session.getAttribute("email"); PreparedStatement pstmt = null;

DBPool dbPool = new DBPool(); Connection connection =

dbPool.getConnectionMysql(DBConfig.urlmysql,

DBConfig.usermysql, DBConfig.passmysql);

pstmt = connection.prepareStatement("SELECT * FROM taikhoan WHERE user_id =" + userid);

ResultSet rs = pstmt.executeQuery(); String tentaikhoanchuyen = ""; String taikhoanchuyen = ""; long sodukhadung = 0; if (rs.next()) { tentaikhoanchuyen = rs.getString("tentaikhoan"); taikhoanchuyen = rs.getString("sotaikhoan"); sodukhadung = rs.getLong("sodu"); } String guilai = ""; if(request.getParameter("guilai") != null) { guilai = request.getParameter("guilai"); } String xacnhan = ""; if(request.getParameter("xacnhan") != null) { xacnhan = request.getParameter("xacnhan"); } String tentaikhoannhan = ""; if(request.getParameter("tentaikhoannhan") != null) { tentaikhoannhan = request.getParameter("tentaikhoannhan"); } String taikhoannhan = ""; if(request.getParameter("taikhoannhan") != null) { taikhoannhan = request.getParameter("taikhoannhan"); } String sotienbangchu = ""; if(request.getParameter("sotienbangchu") != null) { sotienbangchu = request.getParameter("sotienbangchu"); } String sotienbangso = ""; if(request.getParameter("sotienbangso") != null) { sotienbangso = request.getParameter("sotienbangso"); } String noidungchuyenkhoan = ""; if(request.getParameter("noidungchuyenkhoan") != null) {

noidungchuyenkhoan = request.getParameter("noidungchuyenkhoan"); } boolean ok = false; if ("".equals(tentaikhoannhan) || "".equals(taikhoannhan) || "".equals(sotienbangchu) || "".equals(sotienbangso) || "".equals(noidungchuyenkhoan)) {

request.setAttribute("value_null", "Hãy nhập đầy đủ thông tin");

} else {

pstmt = connection.prepareStatement("SELECT * FROM taikhoan WHERE sotaikhoan like '" + taikhoannhan + "'");

rs = pstmt.executeQuery(); if (rs.next()) {

ok = true; } else { ok = false;

request.setAttribute("taikhoankhongtontai", "Tài khoản khơng có trong hệ thống");

} if (ok) {

pstmt = connection.prepareStatement("SELECT * FROM taikhoan WHERE tentaikhoan like '" + tentaikhoannhan + "'");

rs = pstmt.executeQuery(); if (rs.next()) {

ok = true; } else { ok = false;

request.setAttribute("tentaikhoankhongdung", "Tên Tài khoản không đúng"); } } int user_id = 0; try { tienchuyen = Integer.parseInt(sotienbangso); user_id = Integer.parseInt(userid); if(sodukhadung < tienchuyen) { ok = false;

request.setAttribute("tienvuotquasodu", "Số tiền vượt quá số dư khả dụng");

}

}catch(Exception e) { ok = false;

request.setAttribute("sotienbangsoloi", "Nhập sai số tiền bằng số");

}

if((ok && "".equals(xacnhan)) || "1".equals(guilai)) { CreateOTP createotp = new CreateOTP();

code = createotp.CreateOTPMain(user_id, connection); send = createotp.senEmailOtp(DBConfig.email, email,

DBConfig.pass_from_email, "One-Time_Passwod", "One-Time_Passwod: "+code) ;

} }

if(!"".equals(xacnhan)) {

XacNhan xn = new XacNhan();

xacnhanthanhcong = xn.xacNhanOtpCode(userid, xacnhan); xacnhanroi = true;

if(xacnhanthanhcong) {

XulyGiaoDich giaodich = new XulyGiaoDich(); giaodichthanhcong =

giaodich.chuyenKhoan(taikhoanchuyen, taikhoannhan, tienchuyen, noidungchuyenkhoan);

} } %>

<form name="mainform" method="post" action="Service.jsp"> <table width="1024" align="center" border="0" cellpadding="0"

cellspacing="0"> <tr> <br/>

<td align="center" ><h1>Chuyển khoản trong hệ thống</h1></td> </tr>

<tr>

<td align="center" >

<table width="100%" align="center" cellpadding="3" cellspacing="3">

<tr>

<td width="155" class="menuLink"> Tên Tài Khoản :

</td>

<td width="226" class="menuLink">

<input name="tentaikhoanchuyen" type="text" value="<%=tentaikhoanchuyen%>" readonly/> </td> <td width="226" class="menuLink"> </td> </tr> <tr> <td width="155" class="menuLink"> Số tài khoản : </td> <td width="155" class="menuLink">

<input name="taikhoanchuyen" type="text" value="<%=taikhoanchuyen%>" readonly/> </td> <td width="226" class="menuLink"> </td> </tr> <tr> <td width="155" class="menuLink"> Số dư khả dụng: </td> <td width="155" class="menuLink"> <input name="sodukhadung" type="text"

value="<%=sodukhadung%>" readonly/>vnđ </td> <td width="226" class="menuLink"> </td> </tr> <tr>

<td colspan="3" width="226" class="menuLink"> <hr/>

</td> </tr> <tr>

<td width="155" class="menuLink"> Tên Tài Khoản người nhận : </td>

<td width="226" class="menuLink">

<input name="tentaikhoannhan" type="text" value="<%=tentaikhoannhan%>"/> </td> <td width="226" class="menuLink"> <%if(request.getParameter("tentaikhoankhongdung") != null) {%> <%=request.getParameter("tentaikhoankhongdung") %> <%}%> </td> </tr> <tr> <td width="155" class="menuLink"> Số tài khoản người nhận :

</td>

<td width="155" class="menuLink"> <input name="taikhoannhan" type="text"

value="<%=taikhoannhan%>"/> </td> <td width="226" class="menuLink"> <%if(request.getParameter("taikhoankhongtontai") != null) {%> <%=request.getParameter("taikhoankhongtontai") %> <%}%> </td> </tr> <tr> <td width="155" class="menuLink"> Số tiền bằng chữ: </td> <td width="155" class="menuLink">

<input name="sotienbangchu" type="text" value="<%=sotienbangchu%>"/> </td> <td width="226" class="menuLink"> </td> </tr> <tr> <td width="155" class="menuLink"> Số tiền bằng số: </td> <td width="155" class="menuLink"> <input name="sotienbangso" type="text"

value="<%=sotienbangso%>"/>vnđ </td> <td width="226" class="menuLink"> <%if(request.getParameter("tienvuotquasodu") != null) {%> <%=request.getParameter("tienvuotquasodu") %> <%}%> <%if(request.getParameter("sotienbangsoloi") != null) {%> <%=request.getParameter("sotienbangsoloi") %> <%}%> </td>

</tr> <tr>

<td width="155" class="menuLink"> Nội dung chuyển khoản:

</td>

<td width="155" class="menuLink">

<input name="noidungchuyenkhoan" type="text" value="<%=noidungchuyenkhoan %>"/> </td> <td width="226" class="menuLink"> </td> </tr> <tr>

<td colspan="3" align="center" class="menuLink"> <%if(request.getAttribute("value_null") != null ){%> <span style="color: red"><%=request.getAttribute("value_null")%></span> <%}%> </td> </tr>

<%if((send && !giaodichthanhcong) || (xacnhanroi && !xacnhanthanhcong)) {%>

<tr><td><br/></td></tr> <tr>

<td align="right" width="226" class="menuLink"> <h3 style="color: blue">Nhập mã xác nhận:</h3> </td>

<td align="left" width="226" class="menuLink"> <input type="text" name="xacnhan"/>

</td>

<td align="left" width="226" class="menuLink"> <%if(xacnhanroi) {%>

<%if(!xacnhanthanhcong) {%>

<span style="color: red"> Mã xác nhận không đúng!</span>

<%}%> <%}%>

<input type="button" onclick="checkButton(1);" value="Gửi lại mã"/>

</td> </tr> <tr>

<td align="center" width="226" class="menuLink"> </td>

<td align="left" width="226" class="menuLink"> <input type="submit" value="Chấp nhận"/> </td>

<td align="center" width="226" class="menuLink"> </td>

</tr>

<%}else if(!giaodichthanhcong) {%> <tr>

<td align="center" width="226" class="menuLink"> </td>

<td align="left" width="226" class="menuLink"> <input type="submit" value="Hoàn thành"/> </td>

<td align="center" width="226" class="menuLink"> </td>

</tr>

<%}if(giaodichthanhcong) {%> <tr><td><br/></td></tr> <tr>

<td align="center" width="226" class="menuLink"> </td>

<td align="left" width="226" class="menuLink"> <h2 style="color: blue"> Thông báo: Giao dịch đã

thành công!</h2>

</td>

<td align="center" width="226" class="menuLink"> </td> </tr> <%}%> </table> </td> </tr> <tr> <td align="right">&nbsp;</td> </tr> </table> </form> </td> </tr> <tr> <td background="images/bg2.gif">&nbsp;</td> </tr> <tr>

<td><span class="allproduct-headline">Demo OTP-One Time Password For Bank </span></td>

</tr>

<%dbPool.closeConnection(connection, null);%> </table>

</body> </html>

<SCRIPT language="JAVASCRIPT" type="text/javascript"> function checkButton(guilai) {

var frm = "mainform";

document.forms[frm].action = "";

document.forms[frm].action = "Service.jsp?guilai=" + guilai; document.forms[frm].submit();

} </SCRIPT>

3. Mô đun XacNhan

public class XacNhan {

public boolean xacNhanOtpCode(String user_id, String code) { boolean result = false;

PreparedStatement pstmt = null; DBPool dbPool = new DBPool();

Connection connection = dbPool.getConnectionMysql(DBConfig.urlmysql, DBConfig.usermysql, DBConfig.passmysql);

try {

pstmt = connection.prepareStatement("SELECT * FROM otp_code WHERE user_id =" + user_id

+" and code ='"+code+"'"); ResultSet rs = pstmt.executeQuery(); if (rs.next()) {

result = true;

pstmt = connection.prepareStatement(sqlStr); pstmt.executeUpdate(); } } catch (Exception e) { e.printStackTrace(); }finally { try { connection.close();

} catch (SQLException ex) {

Logger.getLogger(XacNhan.class.getName()).log(Level.SEVERE, null, ex); } } return result; } }

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu vấn đề xác thực giao dịch ngân hàng trực tuyến sử dụng mật khẩu dạng OTP (Trang 64 - 74)

Tải bản đầy đủ (PDF)

(74 trang)