- [DEVEXPRESS] Hỗ trợ tìm kiếm highlight không dấu và không khoảng cách trên Gridview Filter
- [C#] Chia sẻ source code phần mềm Image Downloader tải hàng loạt hình ảnh từ danh sách link url
- [C#] Chụp hình và quay video từ camera trên winform
- [C#] Chia sẽ full source code tách file Pdf thành nhiều file với các tùy chọn
- Giới thiệu về Stock Tracker Widget - Công cụ theo dõi cổ phiếu và cảnh báo giá tăng giảm bằng C# và WPF
- [VB.NET] Chia sẻ công cụ nhập số tiền tự động định dạng tiền tệ Việt Nam
- [VB.NET] Hướng dẫn fill dữ liệu từ winform vào Microsoft word
- [VB.NET] Hướng dẫn chọn nhiều dòng trên Datagridview
- Hướng Dẫn Đăng Nhập Nhiều Tài Khoản Zalo Trên Máy Tính Cực Kỳ Đơn Giản
- [C#] Chia sẻ source code phần mềm đếm số trang tập tin file PDF
- [C#] Cách Sử Dụng DeviceId trong C# Để Tạo Khóa Cho Ứng Dụng
- [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
- [C#] Hướng dẫn download file từ Minio Server 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;
    
ENDVậ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 !

![[MySQL - MariaDB] Chức năng Đăng ký tài khoản sử dụng Store Procedure và Function](https://laptrinhvb.net/uploads/users/	f303dd9989494859f618ede6ef0f2655.jpg)

![[SQLSERVER] Loại bỏ Restricted User trên database MSSQL](https://laptrinhvb.net/uploads/source/DATABASE/foreignkey_sql.png)
![[SQLSERVER] Hướng dẫn tạo script sql từ ứng dụng Sqlserver management Studio](https://laptrinhvb.net/uploads/source/DATABASE/script_sql.png)
![[DATABASE] Xóa lịch sử danh sách đăng nhập tài khoản trên SMSS Sqlserver Management Studio](https://laptrinhvb.net/uploads/source/DATABASE/delete_login_smss.png)
![[DATABASE] Sự khác nhau giữa hai câu lệnh TRUNCATE vs DELETE trong sqlserver](https://laptrinhvb.net/uploads/source/DATABASE/sqlserver_wordwrap_thumb.png)
![[DATABASE] TSQL view max length all column data trên table Sqlserver](https://laptrinhvb.net/uploads/source/DATABASE/sql-trigger.jpg)
![[DATABASE] Phân biệt câu lệnh DDL và DML trong sqlserver](https://laptrinhvb.net/uploads/source/dml_ddl.png)
![[DATABASE] Tách số và chữ từ chuỗi - hàm tối ưu hóa tách số và chữ trong Sqlserver](https://laptrinhvb.net/uploads/source/DATABASE/sql-function-to-get-number-from-string.jpg)
![[DATABASE] Khóa chính Primary Key trong Sqlserver](https://laptrinhvb.net/uploads/source/DATABASE/primary_key.jpg)
![[DATABASE] Chia sẻ dữ liệu Pantone Color sql và json api](https://laptrinhvb.net/uploads/source/DATABASE/panton_color.png)
![[DATABASE] Hướng dẫn tạo Procedure String Split in Mysql](https://laptrinhvb.net/uploads/source/new_image_baiviet/mysql_thub.jpg)
![[DATABASE] Hiển thị Emoji trên cơ sở dữ liệu Sqlserver](https://laptrinhvb.net/uploads/source/DATABASE/emoji_in_sqlserver.png)
![[SQLSERVER] Hướng dẫn tìm kiếm nâng cao trên sql](https://laptrinhvb.net/uploads/source/DATABASE/sqlserver_search_advance.png)
![[DATABASE] In cây thông noel bằng sqlserver](https://laptrinhvb.net/uploads/source/new_image_baiviet/x_mas_tree_sql.png)
![[DATABASE] Hướng dẫn mã hóa và giải mã sử dụng thuật toán AES 256 trên sqlserver](https://laptrinhvb.net/uploads/source/new_image_baiviet/aes_sql.png)
![[DATABASE] Base64 Encode and Decode  trong Sqlserver](https://laptrinhvb.net/uploads/source/new_image_baiviet/b64-fb.png)
![[DATABASE] Hướng dẫn sử dụng Hàm ASCII trong sqlserver](https://laptrinhvb.net/uploads/source/DATABASE/ascii_sql.png)
