- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[MySQL - MariaDB] Chức năng Đăng ký tài khoản sử dụng Store Procedure và Function
Khi bạn có một công việc có cùng một câu lệnh, nhưng phải sử dụng ở nhiều nơi, bạn sẽ nghĩ ngay đến viết một hàm chứa nó và khi cần chỉ việc gọi ham. Cực kỳ quốc tế và cũng rất bình dân.
Trong ví dụ này, mình sẽ tạo ra một store procedure đăng ký tài khoản, có chức năng mã hóa mật khẩu. Và sử dụng function để tạo ra private key và tạo chuỗi password từ private key đó. Khá mơ hồ đúng không ? Xem ví dụ sẽ rõ thôi. Đơn giản lắm :))
Trong bài trước mình đã tạo ra một store procedure đơn giản dùng để làm chức năng login. Bài này mình sẽ nâng cấp nó lên 1 chút, đó là mình sẽ mã hóa mật khẩu trước khi lưu xuống database cũng như khi truy vấn kiểm tra.
Bắt đầu nhé.
- Tạo một chuỗi mã hóa ngẫu nhiên, có độ dài ngẫu nhiên từ 11-41 ký tự:
SELECT SUBSTRING(REPLACE(REPLACE(REPLACE( TO_BASE64(MD5(RAND())), '=',''),'+',''),'/',''), 2, FLOOR(10+RAND()*31));
Chúng ta tạo một function chứa câu lệnh này để có thể xài nhiều nơi:
create FUNCTION UFN_Generate_Key()
RETURNS varchar(50)
return SUBSTRING(REPLACE(REPLACE(REPLACE( TO_BASE64(MD5(RAND())), '=',''),'+',''),'/',''), 2, FLOOR(10+RAND()*31));
- Tiếp theo sẽ là một hàm mã hóa mật khẩu kèm chuỗi khóa, sau đó trả về một chuỗi mật khẩu dùng để lưu và truy vấn database:
CREATE FUNCTION Get_Password(pr_password varchar(50), pr_private_key varchar(50) )
RETURNS VARCHAR(50)
return sha1(concat(pr_password, pr_private_key ,`GetKey2`('pw')));
#trong đây bạn có thể thêm nhìu cách mã hóa khác, như là thêm một khóa nữa, hoặc sha1 bao nhiu lần túy ý.
#Trong trường hợp trên mình có tạo ra một function `GetKey2`('pw') trả về một chuỗi do mình chỉ định, chuỗi này mình tự tạo.
#Các bạn có thể tự tạo ra một function tương tự trả về một chuỗi theo ý của bạn, nhằm tăng độ khó cho các thiên tài giải mã :)).
- Cuối cùng là viết store procedure Đăng ký tài khoản:
CREATE PROCEDURE USP_Register(pr_username varchar(50), pr_password varchar(50))
BEGIN
DECLARE isExists int DEFAULT -1;
DECLARE privateKey VARCHAR(50);
DECLARE pw varchar(50);
SELECT COUNT(*) INTO isExists FROM tbl_account;
IF (isExists>0) THEN
SELECT 'Tài khoản đã tồn tại !';
#Với câu lệnh SELECT store procedure sẽ trả về dữ liệu và không chạy những lệnh sau đó
END IF;
SET privateKey=UFN_Generate_Key();
SET pw=Get_Password(pr_password, privateKey); #function này đã tạo ra ở bước trên
#Với table tbl_account có cấu trúc tbl_account(username varchar(50), password varchar(100), private_key varchar(50))
INSERT INTO tbl_account(username,password,private_key)
VALUES (pr_username, pw, privateKey);
IF(row_count()>0) THEN
SELECT 'Đã đăng ký thành công !'; #hoặc trả về user vừa được đăng ký
ELSE
SELECT 'SOMETHING WRONG !!!';
END IF;
END;
Ở ví dụ trên mình phải lưu private key cho từng user, do nó sẽ tự tạo ra khi đăng ký nên sẽ không ai giống ai cả, do đó cần phải lưu lại để sau này truy vấn và check password khi login.
Có Register rồi thì cũng nên sửa lại procedure login bài trước luôn nhở :))
CREATE PROCEDURE `usp_login`(IN `pr_username` varchar(50), IN `pr_password` varchar(50))
BEGIN
DECLARE privateKey VARCHAR(50);
DECLARE isExists INT DEFAULT -1;
DECLARE pw VARCHAR(50) ;
SELECT private_key INTO privateKey FROM tbl_account WHERE username=pr_username;
SET pw=Get_Password(pr_password, private_key ); #function này đã tạo ra ở bước trên
SELECT COUNT(*) INTO isExists FROM tbl_account WHERE username=pr_username AND password=pw;
IF(isExists >0) THEN
SELECT 'Đăng nhập thành công !';
ELSE
SELECT 'Tên đăng nhập hoặc mật khẩu không đúng !';
END IF;
END
Vậy là đã hoàn tất register và login, hiện tại mình cũng xài theo cách này. Khá là thô sơ nhưng mình nghĩ cũng không phải là không hiệu quả.
CÁM ƠN CÁC BẠN ĐÃ THEO DÕI BÀI VIẾT !
Đừng quên để lại bình luận bên dưới nhé !!!
HAPPY CODING !