- [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
- [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 mã hóa mật khẩu tài khoản ứng dụng đúng chuẩn Men
Xin chào các bạn, bài viết hôm nay mình hướng dẫn các bạn các thuật toán bảo mật dùng để mã hóa mật khẩu của người dùng trên ứng dụng vào database sqlserver.
[C#] Cách bảo mật mã hóa mật khẩu tài khoản người dùng chuẩn Men
Lúc trước chúng ta thường mã hóa mật khẩu là dùng các thuật toán mã hóa 1 chiều (không giải mã ngược lại) như: MD5, SHA1...
Tuy nhiên, với máy tính ngày càng hiện tại và tốc độ xử lý ngày càng nhanh.
Các hacker có thể sử dụng các cách để hack mật khẩu của bạn như: dùng từ điển,...
Tại sao mã hóa bằng MD5 không còn an toàn?
MD5 là một thuật toán băm (hashing algorithm) được sử dụng để tạo ra một giá trị băm (hash value) duy nhất từ một đầu vào (input) bất kỳ.
MD5 đã được sử dụng rộng rãi trong quá khứ để bảo mật các thông tin như mật khẩu và chữ ký điện tử.
Tuy nhiên, ngày nay, MD5 không còn được coi là an toàn cho việc mã hóa các thông tin nhạy cảm. Có hai nguyên nhân chính cho sự không an toàn của MD5:
-
Tiến trình va chạm (collision attacks): MD5 đã bị phá vỡ bởi các nhà nghiên cứu bằng cách tìm ra hai đầu vào khác nhau nhưng cho cùng một giá trị băm. Việc này cho phép kẻ tấn công tạo ra một tệp tin giả mạo hoặc một thông điệp giả mạo mà có cùng giá trị băm với tệp tin hoặc thông điệp gốc.
-
Khả năng dự đoán (predictability): MD5 dễ dàng bị tấn công bởi các kẻ tấn công thông minh để dự đoán giá trị băm tiếp theo được tạo ra từ các đầu vào. Điều này có nghĩa là kẻ tấn công có thể tạo ra các đầu vào mới với cùng giá trị băm với các đầu vào cũ đã biết, giúp họ dễ dàng thao túng thông tin và thực hiện các cuộc tấn công giả mạo.
Vì các lỗ hổng bảo mật trên, nên sử dụng các thuật toán băm khác như SHA-256 hay SHA-3 để đảm bảo an toàn cho các thông tin nhạy cảm.
Hiện nay, có một số thuật toán được sử dụng rộng rãi để mã hóa mật khẩu và được coi là tốt nhất:
-
Argon2: Là một thuật toán băm mật khẩu mới nhất được phát triển để chống lại các cuộc tấn công từ điển và bảo vệ các mật khẩu với các kỹ thuật tấn công mới nhất. Argon2 cũng đặc biệt hiệu quả trong việc chống lại các cuộc tấn công dựa trên GPU và ASIC.
-
bcrypt: Là một thuật toán băm mật khẩu lâu đời được sử dụng rộng rãi và vẫn được coi là rất an toàn. bcrypt sử dụng một phương thức gọi là "salt" để tăng tính bảo mật cho mật khẩu.
-
scrypt: Là một thuật toán băm mật khẩu mạnh mẽ khác, được sử dụng rộng rãi trong các ứng dụng Bitcoin và các ứng dụng khác có liên quan đến tiền điện tử. Nó cũng sử dụng "salt" và có thể được cấu hình để tăng độ phức tạp của việc băm mật khẩu.
Các thuật toán này đều có đặc tính tăng tính bảo mật bằng cách sử dụng các kỹ thuật salt và hash mạnh mẽ, đồng thời chống lại các cuộc tấn công từ điển và bảo vệ các mật khẩu với các kỹ thuật tấn công mới nhất. Tuy nhiên, cần lưu ý rằng một mật khẩu mạnh và phức tạp là yếu tố quan trọng nhất để bảo vệ tài khoản của bạn, bất kể thuật toán nào được sử dụng để mã hóa mật khẩu.
Ở bài viết này, mình sẽ demo ứng dụng mã hóa bằng Bcrypt trên winform C# và lưu trữ vào database.
Các bước thực hiện các bạn có thể tham khảo video bên dưới:
Các bước thực hiện:
Đầu tiên, các bạn tạo bảng trong SQLserver:
create database demologin
use demologin
CREATE TABLE users (
id INT PRIMARY KEY IDENTITY,
username NVARCHAR(50) NOT NULL,
password NVARCHAR(100) NOT NULL,
);
select * from users
- Tiếp đến, chúng ta sẽ tạo 1 project C#, winform:
- Chúng ta, sẽ import thư viện Bcrypt vào từ Nuget như video ở trên.
Full source code C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DemoLoginForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnCreateUser_Click(object sender, EventArgs e)
{
// Get the user input values
string username = txtUserName.Text;
string password = txtPassword.Text;
// Generate a salt for bcrypt encryption
string salt = BCrypt.Net.BCrypt.GenerateSalt();
// Hash the password with bcrypt
string hash = BCrypt.Net.BCrypt.HashPassword(password, salt);
// Connect to the database
string connectionString = "Server=NGUYENTHAO;Database=demologin;Trusted_Connection=True;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Open the database connection
connection.Open();
// Insert the new user into the database
SqlCommand command = new SqlCommand("INSERT INTO users (username, password) VALUES (@username, @password)", connection);
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@password", hash);
command.ExecuteNonQuery();
// Close the database connection
connection.Close();
}
}
private void btnCheckLogin_Click(object sender, EventArgs e)
{
// Get the user input values
string username = txtUserName.Text;
string password = txtPassword.Text;
// Connect to the database
string connectionString = "Server=NGUYENTHAO;Database=demologin;Trusted_Connection=True;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Open the database connection
connection.Open();
// Check if the user exists in the database
SqlCommand command = new SqlCommand("SELECT password FROM users WHERE username=@username", connection);
command.Parameters.AddWithValue("@username", username);
SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
// Get the hashed password from the database
string hashedPassword = reader.GetString(0);
// Verify the input password against the hashed password using bcrypt
bool passwordMatch = BCrypt.Net.BCrypt.Verify(password, hashedPassword);
if (passwordMatch)
{
// Passwords match, user is authenticated
MessageBox.Show("Login successful!");
var frm = new FrmMain(username);
frm.Show();
this.Hide();
}
else
{
// Passwords don't match, user is not authenticated
MessageBox.Show("Incorrect password.");
}
}
else
{
// User not found in the database
MessageBox.Show("User not found.");
}
// Close the database connection and reader
reader.Close();
connection.Close();
}
}
}
}
Kết quả, sau khi mã hóa và lưu trữ dưới database SQLSERVER.
Thanks for watching!