Sha256 trong PHP là gì?

Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh Git chấp nhận cả tên thẻ và tên nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi không mong muốn. Bạn có chắc chắn muốn tạo nhánh này không?

Hầu hết các ứng dụng PHP hiện đại truy cập thông tin người dùng quan trọng và lưu trữ chúng trong cơ sở dữ liệu. Ví dụ: ứng dụng web có thể có hệ thống đăng ký cho người dùng mới. Nhưng bạn nên lưu trữ tên người dùng và mật khẩu trong cơ sở dữ liệu như thế nào?

Bạn phải luôn nghĩ về bảo mật. Nếu mật khẩu được lưu trữ ở dạng văn bản thuần túy, điều gì sẽ xảy ra nếu kẻ tấn công giành được quyền truy cập vào cơ sở dữ liệu của bạn? . Đó là lý do tại sao chúng tôi sử dụng một kỹ thuật gọi là băm mật khẩu để ngăn kẻ tấn công lấy được mật khẩu của người dùng

Trong bài viết này, bạn sẽ tìm hiểu cách lưu trữ mật khẩu an toàn trong cơ sở dữ liệu để ngay cả khi cơ sở dữ liệu của bạn rơi vào tay kẻ xấu thì cũng không có thiệt hại nào

Băm mật khẩu là gì

Băm không phải là một khái niệm mới. Nó đã được sử dụng thực tế trong một thời gian khá dài. Để hiểu băm, hãy nghĩ về dấu vân tay. Mỗi người có một dấu vân tay duy nhất. Tương tự, mỗi chuỗi có thể có một "dấu vân tay kỹ thuật số" có kích thước cố định duy nhất được gọi là hàm băm. Đối với một thuật toán băm tốt, rất hiếm khi hai chuỗi khác nhau có cùng một hàm băm (được gọi là xung đột)

Tính năng quan trọng nhất của hàm băm là quá trình tạo hàm băm là một chiều. Thuộc tính một chiều chỉ ra rằng không thể khôi phục văn bản gốc từ hàm băm của nó. Do đó, băm mật khẩu hoàn toàn phù hợp với nhu cầu lưu trữ mật khẩu an toàn của chúng tôi. Thay vì lưu trữ mật khẩu ở dạng văn bản thuần túy, chúng ta có thể băm mật khẩu và lưu trữ kết quả băm. Nếu sau đó kẻ tấn công giành được quyền truy cập vào cơ sở dữ liệu, anh ta không thể khôi phục mật khẩu ban đầu từ hàm băm

Nhưng xác thực thì sao? . Bạn cần băm mật khẩu đăng nhập và so sánh kết quả với hàm băm được lưu trữ trong cơ sở dữ liệu

Cách băm được thực hiện trong PHP

Có các thuật toán khác nhau để tạo hàm băm của văn bản. Những cái phổ biến nhất là. MD5, SHA1 và Bcrypt. Mỗi thuật toán này đều được hỗ trợ trong PHP. Bạn thực sự nên sử dụng Bcrypt, nhưng tôi sẽ trình bày các lựa chọn thay thế khác trước vì chúng giúp minh họa những gì bạn cần làm để bảo vệ mật khẩu của mình

Hãy bắt đầu với hàm md5() của PHP có thể băm mật khẩu theo thuật toán băm MD5. Ví dụ sau minh họa quá trình đăng ký


<?php
$username = $_POST["username"];
$password = $_POST["password"];

// create connection to database
// ...

// sanitize the inputs
// ...

// create an MD5 hash of the password
$password = md5($password);

// save the values to the database
$sql = "INSERT INTO users (username, password) VALUES (:username, :password)";

$stmt = $db->prepare($sql);

$stmt->execute(array(
    ":username" => $username,
    ":password" => $password
));

Và ví dụ sau đây cho thấy quá trình xác thực


<?php
$username = $_POST["username"];
$password = $_POST["password"];

// create connection to database
// ...

// sanitize the input
// ...

// create an MD5 hash of the password
$password = md5($password);

// retrieve the information from the database
$sql = "SELECT * FROM users WHERE username=:username AND password=:password";
$stmt = $db->prepare($sql);
$stmt->execute(array(
    ":username" => $username,
    ":password" => $password
));

$row = $stmt->fetch();

Trong ví dụ trên, md5() tạo hàm băm 128 bit từ mật khẩu đã cho. Cũng có thể sử dụng 


<?php
$username = $_POST["username"];
$password = $_POST["password"];

// create connection to database
// ...

// sanitize the input
// ...

// create an MD5 hash of the password
$password = md5($password);

// retrieve the information from the database
$sql = "SELECT * FROM users WHERE username=:username AND password=:password";
$stmt = $db->prepare($sql);
$stmt->execute(array(
    ":username" => $username,
    ":password" => $password
));

$row = $stmt->fetch();
0 thay vì md5() để tạo ra hàm băm 160 bit (có nghĩa là có ít khả năng xảy ra xung đột hơn)

Nếu bạn tạo hàm băm MD5 của chuỗi “MySecretPassword” và xuất nó ra trình duyệt, nó sẽ giống như sau

7315a012ecad1059a3634f8be1347846

“MySecretPassword” khi được băm bằng SHA1 sẽ tạo ra kết quả sau

952729c61cab7e01e4b5f5ba7b95830d2075f74b

Không bao giờ băm mật khẩu hai lần. Nó không thêm bảo mật; . Ví dụ: đừng cố tạo hàm băm MD5 của mật khẩu rồi cung cấp nó làm thông tin đầu vào cho 


<?php
$username = $_POST["username"];
$password = $_POST["password"];

// create connection to database
// ...

// sanitize the input
// ...

// create an MD5 hash of the password
$password = md5($password);

// retrieve the information from the database
$sql = "SELECT * FROM users WHERE username=:username AND password=:password";
$stmt = $db->prepare($sql);
$stmt->execute(array(
    ":username" => $username,
    ":password" => $password
));

$row = $stmt->fetch();
0. Nó chỉ đơn giản là tăng xác suất va chạm băm

Đưa mật khẩu băm lên cấp độ tiếp theo

Các nhà nghiên cứu đã tìm thấy một số lỗi trong thuật toán SHA1 và MD5. Đó là lý do tại sao các ứng dụng PHP hiện đại không nên sử dụng hai hàm băm này. Thay vào đó, họ nên sử dụng các thuật toán băm từ họ SHA2 như SHA256 hoặc SHA512. Như tên gợi ý, chúng tạo ra các giá trị băm có độ dài 256 và 512 bit. Chúng mới hơn và mạnh hơn đáng kể so với MD5. Khi số lượng bit tăng lên, xác suất va chạm giảm. Một trong hai điều trên là quá đủ để giữ an toàn cho ứng dụng của bạn

Đoạn mã sau cho biết cách sử dụng hàm băm SHA256 trong PHP


<?php
$password = hash("sha256", $password);

PHP cung cấp chức năng tích hợp sẵn 


<?php
$username = $_POST["username"];
$password = $_POST["password"];

// create connection to database
// ...

// sanitize the input
// ...

// create an MD5 hash of the password
$password = md5($password);

// retrieve the information from the database
$sql = "SELECT * FROM users WHERE username=:username AND password=:password";
$stmt = $db->prepare($sql);
$stmt->execute(array(
    ":username" => $username,
    ":password" => $password
));

$row = $stmt->fetch();
3. Đối số đầu tiên của hàm là tên thuật toán (bạn có thể chuyển các tên thuật toán như sha256, sha512, md5, sha1 và nhiều tên khác). Đối số thứ hai là chuỗi sẽ được băm. Kết quả nó trả về là chuỗi đã băm

Chứng hoang tưởng là tốt – Sử dụng muối để tăng cường bảo mật

Hoang tưởng về tính bảo mật của hệ thống của bạn là tốt. Vì vậy, hãy xem xét một trường hợp khác ở đây. Bạn đã băm mật khẩu của người dùng và lưu trữ nó trong bảng cơ sở dữ liệu. Ngay cả khi kẻ tấn công có quyền truy cập vào cơ sở dữ liệu của chúng tôi, anh ta sẽ không thể xác định mật khẩu ban đầu. Nhưng điều gì sẽ xảy ra nếu anh ấy kiểm tra tất cả các mã băm mật khẩu với nhau và thấy một số trong số chúng giống nhau?

Chúng ta đã biết hai chuỗi sẽ có cùng hàm băm chỉ khi cả hai chuỗi đều giống nhau (trong trường hợp không có bất kỳ xung đột nào). Vì vậy, nếu kẻ tấn công nhìn thấy các giá trị băm giống nhau, anh ta có thể suy ra rằng mật khẩu cho các tài khoản đó giống nhau. Nếu anh ấy đã biết mật khẩu của một trong những tài khoản đó, thì anh ấy chỉ cần sử dụng mật khẩu đó và có quyền truy cập vào tất cả các tài khoản có cùng mật khẩu

Giải pháp là sử dụng một số ngẫu nhiên trong khi tạo hàm băm, được gọi là muối. Mỗi lần chúng tôi tạo hàm băm của mật khẩu, chúng tôi sử dụng một loại muối ngẫu nhiên. Bạn chỉ cần tạo một số ngẫu nhiên có độ dài cụ thể và nối nó vào mật khẩu văn bản thuần túy, sau đó băm nó. Theo cách này, ngay cả khi mật khẩu cho hai tài khoản giống nhau, giá trị băm được tạo sẽ không giống nhau vì muối được sử dụng trong cả hai trường hợp là khác nhau

Sau đây chứng minh việc sử dụng muối

________số 8_______

Để tạo muối, chúng tôi sử dụng hàm 


<?php
$username = $_POST["username"];
$password = $_POST["password"];

// create connection to database
// ...

// sanitize the input
// ...

// create an MD5 hash of the password
$password = md5($password);

// retrieve the information from the database
$sql = "SELECT * FROM users WHERE username=:username AND password=:password";
$stmt = $db->prepare($sql);
$stmt->execute(array(
    ":username" => $username,
    ":password" => $password
));

$row = $stmt->fetch();
4. Đối số đầu tiên là 

<?php
$username = $_POST["username"];
$password = $_POST["password"];

// create connection to database
// ...

// sanitize the input
// ...

// create an MD5 hash of the password
$password = md5($password);

// retrieve the information from the database
$sql = "SELECT * FROM users WHERE username=:username AND password=:password";
$stmt = $db->prepare($sql);
$stmt->execute(array(
    ":username" => $username,
    ":password" => $password
));

$row = $stmt->fetch();
5 tạo ra một số nguyên ngẫu nhiên. Đối số thứ hai là đúng để tăng khả năng số được tạo là duy nhất

Để xác thực người dùng, bạn phải lưu trữ muối được sử dụng để băm mật khẩu (Có thể lưu trữ muối trong một cột khác trong cùng một bảng nơi bạn đã lưu trữ tên người dùng và mật khẩu). Khi người dùng cố gắng đăng nhập, hãy thêm muối vào mật khẩu đã nhập và sau đó băm nó bằng hàm băm

Tiến xa hơn nữa. Sử dụng BCrypt

Tìm hiểu về MD5/SHA1 và muối là cách tốt để hiểu những gì cần thiết cho việc lưu trữ an toàn. Nhưng để triển khai một kế hoạch bảo mật nghiêm túc, Bcrypt là kỹ thuật băm mà bạn nên sử dụng

Bcrypt dựa trên mật mã khối đối xứng Blowfish. Lý tưởng nhất là chúng tôi muốn một thuật toán băm hoạt động rất chậm đối với các nỗ lực bẻ khóa tự động của kẻ tấn công nhưng không quá chậm đến mức chúng tôi không thể sử dụng nó trong các ứng dụng trong thế giới thực. Với Bcrypt, chúng tôi có thể làm cho thuật toán hoạt động chậm hơn n lần trong khi điều chỉnh n theo cách không vượt quá tài nguyên của chúng tôi. Ngoài ra, nếu bạn sử dụng Bcrypt thì không cần lưu trữ muối của bạn trong cơ sở dữ liệu

Hãy cùng xem một ví dụ sử dụng hàm 


<?php
$username = $_POST["username"];
$password = $_POST["password"];

// create connection to database
// ...

// sanitize the input
// ...

// create an MD5 hash of the password
$password = md5($password);

// retrieve the information from the database
$sql = "SELECT * FROM users WHERE username=:username AND password=:password";
$stmt = $db->prepare($sql);
$stmt->execute(array(
    ":username" => $username,
    ":password" => $password
));

$row = $stmt->fetch();
6 để băm mật khẩu


<?php
function generateHash($password) {
    if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
        $salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
        return crypt($password, $salt);
    }
}

Hàm trên kiểm tra xem mật mã Blowfish có khả dụng hay không thông qua hằng số CRYPT_BLOWFISH. Nếu vậy, thì chúng tôi tạo ra một loại muối ngẫu nhiên. Yêu cầu là muối bắt đầu bằng “$2a$” (hoặc “$2y$”, xem thông báo này trên php. net) để chỉ ra thuật toán là Blowfish, theo sau là một số có hai chữ số từ 4 đến 31. Con số này là một tham số chi phí làm cho các cuộc tấn công vũ phu mất nhiều thời gian hơn. Sau đó, chúng tôi nối thêm một chuỗi chữ và số chứa 22 ký tự làm phần chính của muối. Chuỗi chữ và số cũng có thể bao gồm '. ' và '/'

Bây giờ là lúc để xác thực người dùng


<?php
function verify($password, $hashedPassword) {
    return crypt($password, $hashedPassword) == $hashedPassword;
}

Lưu ý rằng chúng tôi không cần muối cho mật khẩu khi xác thực vì nó là một phần của đầu ra được băm

Để biết thêm thông tin về Bcrypt và lý do nên sử dụng nó, hãy xem bài viết của Callum Hopkin Tại sao Bạn nên sử dụng Bcrypt để băm mật khẩu được lưu trữ

Tóm lược

Một biện pháp bảo mật quan trọng cần tuân thủ là luôn băm mật khẩu của người dùng trước khi lưu trữ chúng trong cơ sở dữ liệu của bạn và sử dụng các thuật toán băm hiện đại như Bcrypt, sha256 hoặc sha512 để làm như vậy. Khi bạn làm như vậy, ngay cả khi kẻ tấn công giành được quyền truy cập vào cơ sở dữ liệu của bạn, hắn sẽ không có mật khẩu thực của người dùng của bạn. Bài viết này giải thích các nguyên tắc đằng sau hàm băm, muối và Bcrypt

PHP có hỗ trợ sha256 không?

Hàm crypt() trong PHP cho phép bạn tạo hàm băm của chuỗi đã chỉ định bằng nhiều thuật toán băm khác nhau. Một số giá trị băm được hỗ trợ của hàm này bao gồm blowfish, SHA-256 và MD5 .

Mục đích của SHA 256 là gì?

SHA-256 là viết tắt của Secure Hash Algorithm 256-bit và được sử dụng cho bảo mật mã hóa . Các thuật toán băm mật mã tạo ra các giá trị băm duy nhất và không thể đảo ngược. Số lượng giá trị băm có thể có càng lớn thì khả năng hai giá trị tạo ra cùng một giá trị băm càng nhỏ.

SHA 256 là gì và nó hoạt động như thế nào?

SHA-256 là hàm băm mật mã được cấp bằng sáng chế xuất ra giá trị dài 256 bit . Băm là gì? . Ở dạng được mã hóa, dữ liệu có thể có kích thước không giới hạn, thường chỉ miễn là khi không được mã hóa.

Băm trong PHP là gì?

Hàm băm trong PHP là một phương thức đặc biệt được xác định trước và được sử dụng để chỉ ra một chuỗi ở dạng giá trị xác định được đo từ các ký tự của chuỗi. It is popular for its application as an encryption algorithm and as an index value representation for items in the database.