NEWS

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

[C#] Hướng dẫn mã hóa mật khẩu tài khoản ứng dụng đúng chuẩn Men
Đăng bởi: Thảo Meo - Lượt xem: 8182 16:00:19, 18/02/2023C#   In bài viết

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,...

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 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:

  1. 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.

  2. 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:

  1. 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.

  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 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!

 

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Hướng dẫn mã hóa mật khẩu tài khoản ứng dụng đúng chuẩn Men
Đăng bởi: Thảo Meo - Lượt xem: 8182 16:00:19, 18/02/2023C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.