- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
- [C#] Thiết kế ứng dụng Console đẹp với thư viện Spectre.Console
- [C#] Thiết kế ứng dụng Single Instance và đưa ứng dụng lên trước nếu kiểm tra ứng dụng đang chạy
- [C#] Giới thiệu JSON Web Token và cách đọc chuỗi token
- [C#] Cách tăng giảm font chữ tất cả các control trên winform
- [DEVEXPRESS] Tích hợp chức năng Tìm kiếm Search vào CheckedComboboxEdit
- [C#] Gởi email Metting Calendar Reminder kèm nhắc thời gian lịch họp
- [C#] Tìm kiếm xem danh sách từ khóa có tồn tại trong đoạn văn bản hay không
- [C#] Thiết kế giao diện ứng dụng trên Console sử dụng thư viện Terminal.Gui
- [C#] Hướng dẫn tạo mã VietQR Payment API Winform
- [C#] Sử dụng thư viện BenchmarkDotNet đo hiệu năng của hảm Method
- [DEVEXPRESS] Tìm kiếm không dấu tô màu highlight có dấu trên C# Winform
- [C#] Chia sẻ source code tạo hiệu ứng pixel Image trên winform
- [C#] Hướng dẫn kiểm tra số Container hợp lệ hay không
[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 !