- [TOOL] Chia sẻ phần mềm thay đổi thông tin cấu hình máy tính
- [C#] Hướng dẫn Export dữ liệu ra file Microsoft Word Template
- [C#] Chia sẻ source code tool kiểm tra domain website
- [C#] Hướng dẫn tạo file PDF sử dụng thư viện QuestPDF
- [C#] Hướng dẫn tạo ứng dụng dock windows giống Taskbar
- [C#] Chia sẻ source code sử dụng Object Listview trên Winform
- [VB.NET] Chia sẻ source code quản lý thu chi mô hình 3 lớp Winform
- [DATABASE] Xóa lịch sử danh sách đăng nhập tài khoản trên SMSS Sqlserver Management Studio
- [C#] Sử dụng FolderBrowserDialog Vista trên Winform
- [DEVEXPRESS] Chia sẻ tool Winform UI Templates Early Access Preview (EAP)
- [C#] Chia sẻ source code Spin Content (Trộn nội dung văn bản theo từ đồng nghĩa) trên Winform
- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [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#] 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!