- [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
- [SOFTWARE] Giới thiệu bộ phần mềm tính Kết Cấu Thép HatteSale, Mộng Đơn, Dầm, Sàn, Móng Cọc, Vách, Xà Gồ, Tính Tải Trọng
- [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
- Hướng dẫn khóa file bằng nhiều process id, không cho xóa tập tin
- Hướng dẫn cách tạo Product Id cho ứng dụng phần mềm XXXXX-XXXXX-XXXXX-XXXXX
- [SQLSERVER] Hướng dẫn tạo script sql từ ứng dụng Sqlserver management Studio
- [C#] Hướng dẫn sử dụng thư viện AutoITx lấy id và password Ultraviewer trên winform
- [VB.NET] Hướng dẫn lấy thông tin tài khoản đăng nhập windows và khởi động lại ứng dụng ở chế độ Administrator
- [C#] Sử dụng thư viện Polly gửi lại request api khi request bị lỗi hay rớt mạng
- [DEVEXPRESS] Chia sẻ source code tạo báo cáo report in tem nhãn label trên C# winform
- [DEVEXPRESS] Hướng dẫn vẽ biểu đồ Bar Chart trên Winform
- [C#] Tạo form đăng nhập và đăng ký với hiệu ứng Sliding Animation Effect
- [C#] Hướng dẫn tạo thanh toán đơn hàng qua mã vạch VietQR sử dụng API PayOS hoàn toàn miễn phí
- [C#] Hướng dẫn ghi log ra RichTextBox giống Console trên Winform sử dụng thư viện Serilog
- [C#] Hướng dẫn cách tạo mã QR Code trên file Excel
[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 !