NGHIÊN CỨU PHÁT TRIỂN PHẦN MỀM QUẢN LÝ MẬT KHẨU AN TOÀN TRÊN ANDROID Ngày nay, các nền tảng ứng dụng đều yêu cầu người dùng phải xác thực. Xác thực người dùng có vai trò quan trọng để cấp phép quyền truy cập và sử dụng các tính năng và dịch vụ của ứng dụng. Để xác thực người dùng có rất nhiều cách như sử dụng mật khẩu chuỗi ký tự, mật khẩu dạng hình ảnh, mật khẩu sử dụng một lần (OTP), vân tay, thẻ từ,.v.v. Mật khẩu chuỗi ký tự tuy được phát triển và hoàn thiện từ thập niên 1960 nhưng đến nay vẫn được sử dụng phổ biến nhất do ít tốn kém, tiện lợi và dễ sử dụng. Vì xác thực bằng mật khẩu là phương thức rất phổ biến nên nhiều những kẻ tấn công khi muốn đánh cắp danh tính, truy cập và sử dụng những thông tin để mua bán, phá hoại, đe dọa đã sử dụng hình thức tấn công vào mật khẩu và đã tạo ra nhiều loại tấn công mật khẩu. Để tránh bị tấn công mật khẩu, người dùng được khuyến nghị đặt mật khẩu của mình đủ phức tạp, tức là bao gồm đủ các loại: chữ in hoa, chữ thường, số, kí tự đặc biệt... Tuy nhiên, độ phức tạp của mật khẩu cũng tỉ lệ nghịch với việc người dùng khó có thể ghi nhớ chúng một cách dễ dàng. Theo nghiên cứu của NordPass vào năm 2020, mỗi người sẽ có trung bình 100 mật khẩu vậy nên cộng thêm việc mỗi mật khẩu là khác nhau và đáp ứng độ phức tạp thì việc ghi nhớ hết chúng là rất khó. Giải pháp cho những vấn đề trên là sử dụng phần mềm quản lý mật khẩu trên thiết bị di động chạy hệ điều hành Android để tạo và lưu trữ mật khẩu ở dạng đã được mã hóa để đảm bảo mật khẩu an toàn và giúp người dùng không cần phải ghi nhớ mật khẩu và có thể truy cập mọi lúc mọi nơi nên đó là lý do em chọn đề tài: “Nghiên cứu phát triển phần mềm quản lý mật khẩu trên Android” làm đề tài đồ án tốt nghiệp. Mục tiêu của đồ án là phát triển phần mềm quản lý mật khẩu an toàn trên hệ điều hành Android, giúp người dùng tạo và ghi nhớ mật khẩu một cách thuận tiện . Dữ liệu của mật khẩu sẽ được lưu trữ ở dạng mã hóa giúp đảm bảo tính bí mật, tính toàn vẹn của các thông tin về mật khẩu Sau thời gian nghiên cứu đề tài, nhóm đề tài đã đạt được các mục tiêu đề ra như sau: Về mặt lý thuyết: + Trình bày tổng quan về quản lý mật khẩu, các nguy cơ mất an toàn trong các trình quản lý mật khẩu và các trình quản lý mật khẩu phổ biến hiện nay + Trình bày các nội dung nghiên cứu phát triển phần mềm quản lý mật khẩu an toàn, quy trình phát triển phần mềm an toàn, giải pháp an toàn mật khẩu. Về mặt thực tiễn: + Phát triển thành công phần mềm quản lý mật khẩu an toàn trên android, viết giao diện và thử nghiệm hoạt động của phần mềm. Phần mềm hoạt động ổn định và thực hiện đúng chức năng đã đặt ra. Hướng phát triển tương lại: + Hoàn thiện phần mềm và đưa lên Google Play store. + Xây dựng phần mềm trên nền tảng hệ điều hành IOS
ĐẠI HỌC BÁCH KHOA HÀ NỘI LUẬN VĂN THẠC SĨ NGHIÊN CỨU PHÁT TRIỂN PHẦN MỀM QUẢN LÝ MẬT KHẨU AN TOÀN TRÊN ANDROID Nguyen Thanh Long Hà Nội - 2023 MỤC LỤC LỜI CẢM ƠN Lỗi! Thẻ đánh dấu không được xác định LỜI CAM ĐOAN Lỗi! Thẻ đánh dấu không được xác định MỤC LỤC i DANH MỤC KÍ HIỆU VÀ TỪ VIẾT TẮT ii DANH MỤC CÁC BẢNG iii DANH MỤC CÁC HÌNH VẼ iv LỜI NÓI ĐẦU CHƯƠNG VẤN ĐỀ AN TOÀN TRONG QUẢN LÝ MẬT KHẨU 1.1 Tổng quan quản lý mật 1.2 Trình quản lý mật phổ biến 1.3 Các nguy mất an tồn các trình quản lý mật 12 1.4 Kết luận chương 18 CHƯƠNG NGHIÊN CỨU PHÁT TRIỂN PHẦN MỀM QUẢN LÝ MẬT KHẨU AN TOÀN TRÊN ANDROID 19 2.1 Quy trình phát triển phần mềm phần mềm an tồn 19 2.2 Giải pháp quản lý an toàn mật 24 2.3 Kết luận chương 37 CHƯƠNG XÂY DỰNG PHẦN MỀM QUẢN LÝ MẬT KHẨU AN TOÀN TRÊN ANDROID 38 3.1 Xây dựng phần mềm quản lý mật an toàn 38 3.2 Cài đặt đánh giá phần mềm 46 3.3 Kết luận chương 56 KẾT LUẬN 57 TÀI LIỆU THAM KHẢO 58 PHỤ LỤC 59 PHỤ LỤC 60 PHỤ LỤC 62 PHỤ LỤC 64 PHỤ LỤC 66 PHỤ LỤC 67 i DANH MỤC KÍ HIỆU VÀ TỪ VIẾT TẮT Viết tắt Giải thích tiếng anh Giải thích tiếng việt Advanced Encryption Standard Tiêu chuẩn mã hóa tiên tiến Hash-Based Message Authentication Codes Mã xác thực thông báo dựa hàm băm Password-Based Key Derivation Function Hàm dẫn xuất khóa dựa mật Database Cơ sở liệu CTSS Compatible Time Sharing System Hệ thống chia sẻ tương thích thời gian HTTP Hyper Text Tranfer Protocol Giao thức truyền tải siêu văn HTTPS Hyper Text Tranfer Protocol Secure Giao thức truyền tải siêu văn bảo mật OTP One Time Password Mật dùng lần SHA Secure Hash Algorithm Thuật toán băm an toàn AES HMAC PBKDF2 DB ii DANH MỤC CÁC BẢNG Bảng 1.1 Tệp mật được chuẩn bị trước Bảng 1.2 Tệp chứa tài khoản, mật bị tấn công từ hệ thống Bảng 3.1 Cơ sở liệu đăng nhập 41 Bảng 3.2 Cơ sở liệu người dùng 43 iii DANH MỤC CÁC HÌNH VẼ Hình 1.1 Các gói cài đặt KeePass Hình 1.2 Đặt mật 1Password Hình 1.3 1Password Emercy Kit Hình 1.4 Các mẫu cung cấp sẵn 1Password Hình 1.5 Giao diện các lựa chọn thêm mật LastPass 10 Hình 1.6 Icon đính kèm mật LastPass 11 Hình 1.7 Nhập mật trước sử dụng LastPass 11 Hình 1.8 Thơng báo trang web có chứng khơng được tin cậy 14 Hình 1.9 Bảo mật sở liệu các yếu tố liên quan 14 Hình 1.10 Các mối đe doạ bảo mật sở liệu 15 Hình 1.11 Các rủi ro bảo mật sở liệu 16 Hình 1.12 Các lỗ hổng bảo mật sở liệu 16 Hình 1.13 Mơ hình bảo mật sở liệu tổng quát 17 Hình 1.14 Phương pháp thực bảo mật sở liệu 17 Hình 2.1 Phát triển phần mềm giai đoạn lấy yêu cầu 19 Hình 2.2 Phát triển phần mềm giai đoạn thiết kế 20 Hình 2.3 Phát triển phần mềm giai đoạn viết phần mềm 21 Hình 2.4 Phát triển phần mềm giai đoạn kiểm thử 22 Hình 2.5 Phát triển phần mềm giai đoạn phát hành 23 Hình 2.6 Phát triển phần mềm giai đoạn bảo trì 24 Hình 2.7 Mật phổ biến nhất Việt Nam theo NordPass 25 Hình 2.8 Sơ đồ tổng quan thuật toán Bcrypt 27 Hình 2.9 Sơ đồ thuật toán AES 35 Hình 3.1 Use-case phần mềm quản lý mật 39 Hình 3.2 Sơ đồ hoạt động phần mềm 40 Hình 3.3 Sơ đồ hoạt động đăng ký 41 Hình 3.4 Sơ đồ hoạt động đăng nhập 42 Hình 3.5 Sơ đồ hoạt động hiển thị chỉnh sửa thông tin lưu trữ 43 Hình 3.6 Sơ đồ hoạt động tạo thông tin lưu trữ 44 Hình 3.7 Sơ đồ hoạt động thay đổi mật đăng nhập 45 Hình 3.8 Giao diện khởi động phần mềm 46 Hình 3.9 Giao diện đăng nhập 46 Hình 3.10 Giao diện tạo tài khoản 47 Hình 3.11 Giao diện hiển thị thơng tin lưu trữ 47 Hình 3.12 Giao diện thêm thông tin lưu trữ 48 Hình 3.13 Thử nghiệm hoạt động tạo tài khoản 48 Hình 3.14 Cơ sở liệu đăng nhập sau tạo tài khoản 49 iv Hình 3.15 Thử nghiệm hoạt động đăng nhập 50 Hình 3.16 Thử nghiệm hoạt động hiển thị thông tin lưu trữ 50 Hình 3.17 Thử nghiệm hoạt động tạo thông tin lưu trữ 51 Hình 3.18 Thử nghiệm hoạt động hiển thị thông tin vừa thêm 51 Hình 3.19 Thử nghiệm hoạt động menu tùy chọn 52 Hình 3.20 Giao diện thay đổi mật đăng nhập 52 Hình 3.21 Cơ sở liệu được mã hóa 54 Hình 3.22 Mở sở liệu được mã hóa 54 Hình 3.23 Mở sở liệu được mã hóa sau nhập khóa giải mã 55 v LỜI NÓI ĐẦU Ngày nay, các tảng ứng dụng yêu cầu người dùng phải xác thực Xác thực người dùng có vai trị quan trọng để cấp phép quyền truy cập sử dụng các tính dịch vụ ứng dụng Để xác thực người dùng có rất nhiều cách sử dụng mật chuỗi ký tự, mật dạng hình ảnh, mật sử dụng lần (OTP), vân tay, thẻ từ,.v.v Mật chuỗi ký tự được phát triển hoàn thiện từ thập niên 1960 đến được sử dụng phổ biến nhất tốn kém, tiện lợi dễ sử dụng Vì xác thực mật phương thức rất phổ biến nên nhiều kẻ tấn cơng muốn đánh cắp danh tính, truy cập sử dụng thông tin để mua bán, phá hoại, đe dọa sử dụng hình thức tấn cơng vào mật tạo nhiều loại tấn công mật Để tránh bị tấn công mật khẩu, người dùng được khuyến nghị đặt mật đủ phức tạp, tức bao gồm đủ các loại: chữ in hoa, chữ thường, số, kí tự đặc biệt Tuy nhiên, độ phức tạp mật tỉ lệ nghịch với việc người dùng khó ghi nhớ chúng cách dễ dàng Theo nghiên cứu NordPass vào năm 2020, người có trung bình 100 mật nên cộng thêm việc mật khác đáp ứng độ phức tạp việc ghi nhớ hết chúng rất khó Giải pháp cho vấn đề sử dụng phần mềm quản lý mật thiết bị di động chạy hệ điều hành Android để tạo lưu trữ mật dạng được mã hóa để đảm bảo mật an toàn giúp người dùng khơng cần phải ghi nhớ mật truy cập lúc nơi nên lý em chọn đề tài: “Nghiên cứu phát triển phần mềm quản lý mật Android” làm đề tài đồ án tốt nghiệp Mục tiêu đồ án phát triển phần mềm quản lý mật an toàn hệ điều hành Android, giúp người dùng tạo ghi nhớ mật cách thuận tiện Dữ liệu mật được lưu trữ dạng mã hóa giúp đảm bảo tính bí mật, tính tồn vẹn các thông tin mật CHƯƠNG VẤN ĐỀ AN TOÀN TRONG QUẢN LÝ MẬT KHẨU 1.1 Tổng quan quản lý mật 1.1.1 An toàn mật a) Khái niệm mật Mật từ, cụm từ chuỗi ký tự nhằm phân biệt người dùng quy trình được ủy quyền (với mục đích cho phép truy cập) với người dùng trái phép, nói cách khác mật được sử dụng để xác minh danh tính người dùng quá trình xác thực Mật được phát triển vào năm 1961 Massachusetts Intitute of Technology, được sử dụng cho Compatible Time Sharing System (CTSS) Ban đầu tài khoản / mật người dùng được lưu trữ dạng sở liệu rõ Mục tiêu kẻ tấn công hướng tới các tệp tin chứa tất tên người dùng mật khẩu, từ đăng nhập thơng tin người dùng hợp pháp Để giải vấn đề này, ý tưởng sử dụng mật mã để xủa lý mật đời Và hàm băm phương thức được sử dụng để chuyển đổi mật dạng rõ sang dạng mã băm chiều Kể từ mật không được lưu trữ thiết bị mà lưu dạng giá trị mã băm Ý tưởng được công bố từ năm 1974 được sử dụng ngày Năm 1979, hàm băm có sử dụng thêm giá trị salt để mã hóa mạnh hơn[11] Mật giúp người dùng truy cập vào hệ thống với các quyền riêng biệt riêng người dùng như: truy cập vào tệp tin riêng, liệu cá nhân nhạy cảm liệu được cấp phép doanh nghiệp hay tổ chức người dùng Đồng thời giúp ngăn chặn người dùng không được phép truy cập vào tệp tin khơng phải mình, ghi chép thông tin đăng nhập, sử dụng tài nguyên hệ thống Nếu để lộ bị phá mật dẫn đến các nguy mất thông tin cá nhân, mất tài khoản, để lộ tin nhắn tệp tin chứa thông tin nhạy cảm, tổn thất tài sản, tính mạng,… Vì nên việc đặt mật phức tạp, đủ độ an toàn các biện pháp đảm bảo an toàn khác việc rất cần thiết để tự bảo vệ trước các loại tấn công nhằm vào mật người dùng b) Quy tắc đặt mật an toàn Một mật an toàn được coi khó đoán, khơng thể bị phá vỡ trước các loại tấn công phổ biến tấn công từ điển (Dictionary Attack) tấn công vét cạn (Brute force attack) được trình bày mục 1.1.2 Phải đảm bảo mật mang tính ngẫu nhiên, để việc dị tìm kẻ tấn cơng khơng thể tốn rất nhiều thời gian, cho việc bỏ nhiều thời gian để dị tìm mật khơng đáng so với giá trị tài khoản bị tấn công đem lại Để đặt mật an toàn, đủ độ mạnh cần đảm bảo các tiêu chí sau: - Độ dài mật nhất ký tự, nhiều ký tự tốt - Bao gồm nhất ký tự nhóm ký tự: ký tự in hoa, ký tự in thường, số ký tự đặc biệt - Không sử dụng các từ tiếng Việt, tiếng Anh có từ điển - Khơng đặt từ liên quan đến tên mình, tên thú cưng, số điện thoại, ngày sinh (những thông tin kẻ tấn cơng dễ dàng lấy được thơng qua mạng xã hội) Một số lưu ý để mật an tồn: - Khơng lưu mật hệ thống máy tính - Khơng sử dụng chung mật cho nhiều tài khoản khác - Không chia sẻ mật với bạn bè - Không để lại dấu vết để đoán mật mạng xã hội - Sử dụng Anti-Virus, Anti-Spywares để phòng chống keyloggers ghi lại các phím gõ 1.1.2 Các kỹ thuật công mật Tấn công mật hành vi kẻ tấn cơng tìm cách lấy được mật người dùng để xâm nhập vào hệ thống thông tin để thực ý đồ xấu nhằm phá hoại, đánh cắp liệu để trục lợi a) Tấn công kỹ nghệ xã hội (Social Engineering) ❖ Khái niệm Tấn công kỹ nghệ xã hội phương pháp cố gắng tương tác, tìm hiểu các mối quan hệ người dùng để dễ dàng tìm đến các thơng tin liên quan mật Khi các cá nhân bị nhắm đến, tin tặc cố gắng lừa nạn nhân cung cấp cho chúng mật khẩu, tiết lộ thông tin điều hướng nạn nhân truy cập trái phép vào máy chủ bất hợp pháp có chứa mã độc Điều dẫn tới người dùng bị mất tài khoản, thông tin ngân hàng hay quyền kiểm soát máy tính rơi vào tay tin tặc Kỹ thuật xã hội loại kỹ thuật thường được sử dụng thực qua Internet, tỉ lệ thành cơng rất cao người dùng bình thường khơng tinh ý hay khơng có đủ kiến thức an tồn thơng tin rất dễ bị lừa ❖ Các phương thức công - Tấn công dựa vào yếu tố người: + Mạo danh: tội phạm cố gắng thuyết phục người dùng tiết lộ thông tin cá nhân các thông tin liên quan đến mật cách gọi điện thoại yêu cầu hỗ trợ để thăm dò giả mạo nhân viên công ty để trà trộn vào thu thập thông tin - Tấn công dựa vào kỹ thuật: + Spear phishing: tấn công nhắm đến người dùng cụ thể, thường mục tiêu có giá trị cao người tiếng, quản lý các quan chức phủ cấp cao + Voice phishing: người lạ gọi điện đến thông báo cho nạn nhân trúng giải thưởng đó, để nhận được giải thưởng cần phải cung cấp thông tin cá nhân, tài khoản, mật để nhận thưởng + SMS Phishing: tin nhắn được gửi đến điện thoại máy tính có các liên kết đến trang web kẻ tấn công kiểm soát + Email Phishing: phương pháp lừa đảo truyền thống nhất, sử dụng email thúc giục trả lời Thường đính kèm các liên kết trang web, số điện thoại các tệp phần mềm độc hại + Cơng cụ tìm kiếm lừa đảo: đặt liên kết đến các trang web giả mạo đầu kết các cơng cụ tìm kiếm phổ biến google, bing, + Baiting attack: lợi dụng tò mò để dụ người dùng tương tác với kẻ tấn cơng Thường thơng qua thứ miễn phí độc quyền nhằm lây nhiễm phần mềm độc hại để usb nơi công cộng, đính kèm email phiếu mua hàng miễn phí giả,… b) Tấn công vét cạn (Brute Force Attack) ❖ Khái niệm Tấn công vét cạn loại tấn công mật tổ hợp tất ký tự phân tích phản hồi thành cơng, được dùng để chống lại việc băm mật Loại tấn cơng có khả thành cơng rất cao tốn nhiều thời thơng tin tên đăng nhập mật dạng mã băm mật gốc Do khơng thể tìm khóa để giải mã sở liệu Hình liệu mở file sở liệu được mã hóa mà khơng có khóa để giải mã Hình 3.21 Cơ sở liệu mã hóa + Để mở được file sở liệu cần sử dụng phần mềm chuyên dụng DB Browser (SQLCipher) nhập khóa có xem được nội dung bên Hình 3.22 Mở sở liệu mã hóa 54 Hình 3.23 Mở sở liệu mã hóa sau nhập khóa giải mã + Người dùng thay đổi mật đăng nhập theo ý thích trường hợp cảm thấy mật khơng cịn an toàn, bị lộ nghi bị lộ Khi thay đổi mật đăng nhập, mật để giải mã sở liệu chứa thông tin tài khoản người dùng thay đổi theo ❖ Tính ứng dụng Với vấn đề được đặt mục 3.1.1, việc xây dựng phần mềm quản lý mật an tồn cần thiết Tính ứng dụng phần mềm thể đặc trưng: + Tính tiện dụng: Ngày nay, hầu hết người có thiết bị di động, đa phần chạy Android Phần mềm được phát triển Android hỗ trợ tối đa tính tiện dụng cho người dùng lúc, nơi + Hỗ trợ đa người dùng: Phần mềm quản lý mật mà nhóm phát triển đề tài phần mềm đa người dùng, dễ dàng cài đặt thiết bị chạy hệ điều hành Android phù hợp với cá nhân sử dụng nhóm người sử dụng + Tạo mật an tồn khơng trùng lặp: Phần mềm hỗ trợ tạo mật tự động an toàn không bị trùng lặp tạo mật giả ngẫu nhiên 55 3.3 Kết luận chương Trong chương trình bày các nội dung xây dựng phần mềm quản lý mật an toàn: Đặt vấn đề, phân tích đề xuất giải pháp, sơ đồ thiết kế phần mềm; Đánh giá phần mềm: Giao diện phần mềm hoàn thiện, thử nghiệm hoạt động đánh giá phần mềm Phần mềm sau hoàn thiện hoạt động xác bám sát theo quy trình các giải pháp đề Phần mềm khắc phục được các nguy mất an toàn các trình quản lý mật 56 KẾT LUẬN Sau thời gian nghiên cứu đề tài, nhóm đề tài đạt được các mục tiêu đề sau: - Về mặt lý thuyết: + Trình bày tổng quan quản lý mật khẩu, các nguy mất an toàn các trình quản lý mật các trình quản lý mật phổ biến + Trình bày các nội dung nghiên cứu phát triển phần mềm quản lý mật an tồn, quy trình phát triển phần mềm an toàn, giải pháp an toàn mật - Về mặt thực tiễn: + Phát triển thành công phần mềm quản lý mật an toàn android, viết giao diện thử nghiệm hoạt động phần mềm Phần mềm hoạt động ổn định thực chức đặt - Hướng phát triển tương lại: + Hoàn thiện phần mềm đưa lên Google Play store + Xây dựng phần mềm tảng hệ điều hành IOS 57 TÀI LIỆU THAM KHẢO [1] Colin Percival, S Josefsson, The scrypt Password-Based Key Derivation Function, August 2016 [2] Mindaug as Jancis, Are password managers safe to use in 2022?, January 2022 [4] Matthias Meier The importance of hashing passwords, part 4: the hardware threat, October 2014 [5] P Gasti and K Rasmussen, On the security of password Manager database formats In ESORICS, LNCS Springer, 2012 [6] M Blanchou, P Youn, Password managers: Exposing passwords everywhere, 2013 [7] Dan goodin, Backdoored password manager stole data from as many as 29K enterprises, April 2021 [8] Advanced Encryption Standard (AES) Algorithm to Encrypt and Decrypt Data, June 2017 [9] Rachmawan Ardiansa, Developing secure Android application with encryted database file using SQLCipher, UteM, 2014 [10] ThS Nghiêm Thị Hương, Hệ quản trị sở liệu SQLite thiết bị di động ứng dụng, Trường Đại học Công nghệ - Đại học Quốc gia Hà Nội, 2014 [11] The Evolution of the Password — And Why It's Still Far From Safe https://mashable.com/2013/12/30/history-of-the-password/ [12] Most common password list https://nordpass.com/most-common-passwords-list/ [13] NIST: Cryptographic Key Length Recommendation, 2020 https://www.keylength.com/en/4/ [14] Analysis Performance BCRYPT Algorithm to Improve Password Security from Brute Force March 2021 Journal of Physics Conference Series 58 PHỤ LỤC MÃ NGUỒN QUY TẮC ĐẶT MẬT KHẨU public class TextUtils { public static boolean validatePassword(final String password){ Pattern pattern; Matcher matcher; final String PASSWORD_PATTERN = "^(?=.*[0-9])" + "(?=.*[A-Z])" + "(?=.*[a-z])" + "(?=.*[@#$%^&+=!])" + "(?=\\S+$)" + ".{8,}$"; pattern = Pattern.compile(PASSWORD_PATTERN); matcher = pattern.matcher(password); return matcher.matches(); } 59 PHỤ LỤC MÃ NGUỒN THUẬT TOÁN BĂM CHẬM BCRYPT // BĂM MẬT KHẨU public static String hashpw(String password, String salt) { BCrypt B; String real_salt; byte passwordb[], saltb[], hashed[]; char minor = (char)0; int rounds, off = 0; StringBuffer rs = new StringBuffer(); if (salt.charAt(0) != '$' || salt.charAt(1) != '2') throw new IllegalArgumentException ("Invalid salt version"); if (salt.charAt(2) == '$') off = 3; else { minor = salt.charAt(2); if (minor != 'a' || salt.charAt(3) != '$') throw new IllegalArgumentException ("Invalid salt revision"); off = 4; } // Extract number of rounds if (salt.charAt(off + 2) > '$') throw new IllegalArgumentException ("Missing salt rounds"); rounds = Integer.parseInt(salt.substring(off, off + 2)); real_salt = salt.substring(off + 3, off + 25); try { passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF8"); } catch (UnsupportedEncodingException uee) { throw new AssertionError("UTF-8 is not supported"); } saltb = decode_base64(real_salt, BCRYPT_SALT_LEN); B = new BCrypt(); hashed = B.crypt_raw(passwordb, saltb, rounds, (int[])bf_crypt_ciphertext.clone()); rs.append("$2"); if (minor >= 'a') rs.append(minor); rs.append("$"); if (rounds < 10) rs.append("0"); if (rounds > 30) { throw new IllegalArgumentException( "rounds exceeds maximum (30)"); } rs.append(Integer.toString(rounds)); rs.append("$"); rs.append(encode_base64(saltb, saltb.length)); rs.append(encode_base64(hashed, bf_crypt_ciphertext.length * - 1)); return rs.toString(); } // XÁC THỰC MẬT KHẨU public static boolean checkpw(String plaintext, String hashed) { byte hashed_bytes[]; byte try_bytes[]; try { String try_pw = hashpw(plaintext, hashed); hashed_bytes = hashed.getBytes("UTF-8"); try_bytes = try_pw.getBytes("UTF-8"); } catch (UnsupportedEncodingException uee) { 60 return false; } if (hashed_bytes.length != try_bytes.length) return false; byte ret = 0; for (int i = 0; i < try_bytes.length; i++) ret |= hashed_bytes[i] ^ try_bytes[i]; return ret == 0; } } //GEN SALT public static String gensalt(int log_rounds, SecureRandom random) { StringBuffer rs = new StringBuffer(); byte rnd[] = new byte[BCRYPT_SALT_LEN]; random.nextBytes(rnd); rs.append("$2a$"); if (log_rounds < 10) rs.append("0"); if (log_rounds > 30) { throw new IllegalArgumentException( "log_rounds exceeds maximum (30)"); } rs.append(Integer.toString(log_rounds)); rs.append("$"); rs.append(encode_base64(rnd, rnd.length)); return rs.toString(); } 61 PHỤ LỤC MÃ NGUỒN XỬ LÝ THAY ĐỔI MẬT KHẨU ĐĂNG NHẬP VÀ KHÓA MÃ HÓA CƠ SỞ DỮ LIỆU public class ChangepasswordActivity extends AppCompatActivity { EditText oldpassword; EditText newpassword; EditText newpasswordRetype; Button bt_changepassword; long userId; String passDbstring; UserDao userDaochangepass; UserInfoDao userInfoDaochangepass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_changepassword); userId = getIntent().getLongExtra("USER_ID", 0); passDbstring= getIntent().getStringExtra("PASS_DB"); userDaochangepass = new UserDao(this); oldpassword = findViewById(R.id.editTextOLDpassword); newpassword = findViewById(R.id.editTextNEWPassword); newpasswordRetype = findViewById(R.id.editTextNEWPasswordRegRetype); bt_changepassword = findViewById(R.id.buttonCHANGEPassword); bt_changepassword.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { changepass(); } }); } private void changepass() { UserModel userModel = userDaochangepass.findOne(userId); String passBcrypted = userModel.getPassWord(); String old_password = oldpassword.getText().toString().trim(); if (BCrypt.checkpw(old_password, passBcrypted)) { String new_password = newpassword.getText().toString().trim(); String new_passwordRetype = newpasswordRetype.getText().toString().trim(); if(new_password.equals(new_passwordRetype)) { if (!TextUtils.validatePassword(new_password)) { Toast.makeText(ChangepasswordActivity.this, R.string.passwordUnsatisfactory, Toast.LENGTH_SHORT).show(); } else { String pwhashedchange = BCrypt.hashpw(new_password, BCrypt.gensalt()); userModel.setPassWord(pwhashedchange); boolean check; check = userDaochangepass.update(userModel); if (check) { String tendb = Constants.DATABASE_INFO_NAME + userModel.getUserName(); userInfoDaochangepass = new UserInfoDao(this, tendb, passDbstring); userInfoDaochangepass.updatePassword(new_password, passDbstring); Intent intent = new Intent(ChangepasswordActivity.this, MainActivity.class); startActivity(intent); Toast.makeText(ChangepasswordActivity.this, "Đổi mật 62 thành công", Toast.LENGTH_LONG).show(); } else { Toast.makeText(ChangepasswordActivity.this, "Thất bại", Toast.LENGTH_LONG).show(); } } }else Toast.makeText(ChangepasswordActivity.this, "Mật nhập lại không khớp", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(ChangepasswordActivity.this, "Mật cũ khơng xác", Toast.LENGTH_SHORT).show(); } } } 63 PHỤ LỤC MÃ NGUỒN XỬ LÝ LƯU TRỮ MẬT KHẨU ĐĂNG NHẬP public class UserDao { SQLiteDatabase database; private final String databasePath; public UserDao(Context context) { UserDatabase userDatabase = new UserDatabase(context); database = userDatabase.open(); this.databasePath = context.getDatabasePath("PW_MANAGER_USER").toString(); } // xử lý lưu public Long save(UserModel userModel){ ContentValues contentValues = new ContentValues(); contentValues.put(UserDatabase.TB_USERS_USERNAME, userModel.getUserName()); contentValues.put(UserDatabase.TB_USERS_PASSWORD, userModel.getPassWord()); return database.insert(UserDatabase.TB_USERS,null,contentValues); } // cập nhật database public Boolean update(UserModel userModel){ ContentValues contentValues = new ContentValues(); contentValues.put(UserDatabase.TB_USERS_USERNAME, userModel.getUserName()); contentValues.put(UserDatabase.TB_USERS_PASSWORD, userModel.getPassWord()); int check = database.update(UserDatabase.TB_USERS, contentValues, UserDatabase.TB_USERS_ID +"="+userModel.getId(),null); return check != 0; } // tìm kiếm user public UserModel findOne(int id){ UserModel userModel = new UserModel(); String query = "select * from "+ UserDatabase.TB_USERS + " where " + UserDatabase.TB_USERS_ID + " = '" + id + "'"; Cursor cursor = database.rawQuery(query,null); cursor.moveToFirst(); return getUserModel(cursor, userModel); } // kiểm tra user public boolean checkUsers(){ //count(*) String query = "select * from "+ UserDatabase.TB_USERS; @SuppressLint("Recycle") Cursor cursor = database.rawQuery(query,null); return cursor.getCount() != 0; } //kiểm tra user public boolean checkUsers(String username) { String query = "select * from "+ UserDatabase.TB_USERS + " where " + UserDatabase.TB_USERS_USERNAME +" = '" +username + "'"; @SuppressLint("Recycle") Cursor cursor = database.rawQuery(query,null); return cursor.getCount() != 0; } // kiểm tra user hợp lệ public UserModel findOneByUserNameAndPassword(String username, String password) { String query = "select * from "+ UserDatabase.TB_USERS + " where " + 64 UserDatabase.TB_USERS_USERNAME +" = '"+ username + "' AND " + UserDatabase.TB_USERS_PASSWORD + " = '" + password +"'"; Cursor cursor = database.rawQuery(query,null); UserModel userModel = new UserModel(); return getUserModel(cursor, userModel); } @SuppressLint("Range") private UserModel getUserModel(Cursor cursor, UserModel userModel) { cursor.moveToFirst(); while (!cursor.isAfterLast()){ userModel.setId(cursor.getInt(cursor.getColumnIndex(UserDatabase.TB_USERS_ID) )); userModel.setUserName(cursor.getString(cursor.getColumnIndex(UserDatabase.TB_ USERS_USERNAME))); userModel.setPassWord(cursor.getString(cursor.getColumnIndex(UserDatabase.TB_ USERS_PASSWORD))); cursor.moveToNext(); } return userModel; } public String getDatabasePath(){ return databasePath; } } 65 PHỤ LỤC MÃ NGUỒN XỬ LÝ SINH MẬT KHẨU CHO CÁC ỨNG DỤNG public static String randomString(int length) { String chuoi = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`~!@#$%^&*()=_+{}[];’:”./>?"; return randomString(chuoi, length); } public static String randomString(String input, int length) { int n = input.length(); Random random = new Random(); String res = ""; for (int i = 0; i < length; i++) { res += (input.charAt(random.nextInt(n))); } return res; } // xử lý độ dài random mật private void ranDomPass() { String Stpasswordlength = txtPasswordLength.getText().toString(); int passwordlength = Integer.parseInt(Stpasswordlength); long timestamp = System.currentTimeMillis(); byte[] timestampbyte = String.valueOf(timestamp).getBytes(); Sha.ShaData timestamphashed = Sha.getSha(timestampbyte); String timestampout = timestamphashed.getShaData1().toString(16); String randomtimestampout = TextUtils.randomString(timestampout,3); if (passwordlength ==0 ) { Toast.makeText(AddInfoActivity.this, "Độ dài không hợp lệ!", Toast.LENGTH_SHORT).show(); } else { if (passwordlength>0 && passwordlength 0; } public String getDatabasePath(){ return databasePath; } } 68