[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 thông tin tài khoản người dùng chuẩn Men

Lúc trước tất cả chúng ta thường mã hóa mật khẩu là dùng những thuật toán mã hóa 1 chiều ( không giải thuật 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à vận tốc giải quyết và 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,…

mã hóa password c#

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 thoáng đãng trong quá khứ để bảo mật thông tin những thông tin như mật khẩu và chữ ký điện tử .
Tuy nhiên, thời nay, MD5 không còn được coi là bảo đảm an toàn cho việc mã hóa những thông tin nhạy cảm. Có hai nguyên do chính cho sự không bảo đảm an toàn của MD5 :

  1. Tiến trình va chạm ( collision attacks ) : MD5 đã bị phá vỡ bởi những nhà nghiên cứu bằng cách tìm ra hai nguồn vào khác nhau nhưng cho cùng một giá trị băm. Việc này được cho phép kẻ tiến công tạo ra một tệp tin trá hình hoặc một thông điệp trá hình mà có cùng giá trị băm với tệp tin hoặc thông điệp gốc .
  2. Khả năng Dự kiến ( predictability ) : MD5 thuận tiện bị tiến công bởi những kẻ tiến công mưu trí để Dự kiến giá trị băm tiếp theo được tạo ra từ những nguồn vào. Điều này có nghĩa là kẻ tiến công hoàn toàn có thể tạo ra những đầu vào mới với cùng giá trị băm với những nguồn vào cũ đã biết, giúp họ thuận tiện thao túng thông tin và thực thi những cuộc tiến công trá hình .

Vì những lỗ hổng bảo mật thông tin trên, nên sử dụng những thuật toán băm khác như SHA-256 hay SHA-3 để bảo vệ bảo đảm an toàn cho những thông tin nhạy cảm .
Hiện nay, có một số ít thuật toán được sử dụng thoáng rộng để mã hóa mật khẩu và được coi là tốt nhất :

  1. Argon2 : Là một thuật toán băm mật khẩu mới nhất được tăng trưởng để chống lại những cuộc tiến công từ điển và bảo vệ những mật khẩu với những kỹ thuật tiến công mới nhất. Argon2 cũng đặc biệt hiệu quả trong việc chống lại những cuộc tiến công dựa trên GPU và ASIC .
  2. 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.

  3. scrypt : Là một thuật toán băm mật khẩu can đảm và mạnh mẽ khác, được sử dụng thoáng đãng trong những ứng dụng Bitcoin và những ứng dụng khác có tương quan đến tiền điện tử. Nó cũng sử dụng ” salt ” và hoàn toàn có thể được thông số kỹ thuật để 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 thông tin bằng cách sử dụng những kỹ thuật salt và hash can đảm và mạnh mẽ, đồng thời chống lại những cuộc tiến công từ điển và bảo vệ những mật khẩu với những kỹ thuật tiến công mới nhất. Tuy nhiên, cần quan tâm 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ệ thông tin 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à tàng trữ vào database .
Các bước triển khai những bạn hoàn toàn có thể tìm hiểu thêm video bên dưới :

Các bước thực thi :
Đầu tiên, những 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à tàng trữ dưới database SQLSERVER .

Thanks for watching!

DOWNLOAD SOURCE

[C#] Hướng dẫn mã hóa mật khẩu tài khoản ứng dụng đúng chuẩn Men

Bài viết liên quan
Hotline 24/7: O984.666.352
Alternate Text Gọi ngay