Hướng dẫn how to decrypt sha256 in php - làm thế nào để giải mã sha256 trong php

Lời tựa

Bắt đầu với định nghĩa bảng của bạn:

- UserID
- Fname
- Lname
- Email
- Password
- IV

Đây là những thay đổi:

  1. Các trường
    $key_size = 32; // 256 bits
    $encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
    // $strong will be true if the key is crypto safe
    
    0,
    $key_size = 32; // 256 bits
    $encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
    // $strong will be true if the key is crypto safe
    
    1 và
    $key_size = 32; // 256 bits
    $encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
    // $strong will be true if the key is crypto safe
    
    2 sẽ được mã hóa bằng mật mã đối xứng, được cung cấp bởi OpenSSL,
  2. Trường
    $key_size = 32; // 256 bits
    $encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
    // $strong will be true if the key is crypto safe
    
    3 sẽ lưu trữ vectơ khởi tạo được sử dụng để mã hóa. Các yêu cầu lưu trữ phụ thuộc vào mật mã và chế độ được sử dụng; thêm về điều này sau.
  3. Trường
    $key_size = 32; // 256 bits
    $encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
    // $strong will be true if the key is crypto safe
    
    4 sẽ được băm bằng băm mật khẩu một chiều,

Mã hóa

Mật mã và chế độ

Chọn mật mã và chế độ mã hóa tốt nhất nằm ngoài phạm vi của câu trả lời này, nhưng lựa chọn cuối cùng ảnh hưởng đến kích thước của cả khóa mã hóa và vectơ khởi tạo; Đối với bài đăng này, chúng tôi sẽ sử dụng AES-256-CBC có kích thước khối cố định là 16 byte và kích thước khóa là 16, 24 hoặc 32 byte.

Khóa mã hóa

Khóa mã hóa tốt là một đốm nhị phân được tạo từ một trình tạo số ngẫu nhiên đáng tin cậy. Ví dụ sau đây sẽ được khuyến nghị (> = 5.3):

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe

Điều này có thể được thực hiện một lần hoặc nhiều lần (nếu bạn muốn tạo một chuỗi các khóa mã hóa). Giữ những thứ này càng riêng tư càng tốt.

Iv

Vectơ khởi tạo thêm tính ngẫu nhiên vào mã hóa và cần thiết cho chế độ CBC. Các giá trị này chỉ được sử dụng lý tưởng chỉ một lần (về mặt kỹ thuật một lần trên mỗi khóa mã hóa), do đó, một bản cập nhật cho bất kỳ phần nào của hàng sẽ tái tạo nó.

Một chức năng được cung cấp để giúp bạn tạo IV:

$iv_size = 16; // 128 bits
$iv = openssl_random_pseudo_bytes($iv_size, $strong);

Thí dụ

Chúng ta hãy mã hóa trường tên, sử dụng

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
5 và
$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
6 trước đó; Để làm điều này, chúng tôi phải chuyển dữ liệu của chúng tôi đến kích thước khối:

function pkcs7_pad($data, $size)
{
    $length = $size - strlen($data) % $size;
    return $data . str_repeat(chr($length), $length);
}

$name = 'Jack';
$enc_name = openssl_encrypt(
    pkcs7_pad($name, 16), // padded data
    'AES-256-CBC',        // cipher and mode
    $encryption_key,      // secret key
    0,                    // options (not used)
    $iv                   // initialisation vector
);

Yêu cầu lưu trữ

Đầu ra được mã hóa, như IV, là nhị phân; Lưu trữ các giá trị này trong cơ sở dữ liệu có thể được thực hiện bằng cách sử dụng các loại cột được chỉ định như

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
7 hoặc
$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
8.

Giá trị đầu ra, như IV, là nhị phân; Để lưu trữ các giá trị đó trong MYSQL, hãy xem xét sử dụng các cột

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
7 hoặc
$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
8. Nếu đây không phải là một tùy chọn, bạn cũng có thể chuyển đổi dữ liệu nhị phân thành biểu diễn văn bản bằng cách sử dụng
$iv_size = 16; // 128 bits
$iv = openssl_random_pseudo_bytes($iv_size, $strong);
1 hoặc
$iv_size = 16; // 128 bits
$iv = openssl_random_pseudo_bytes($iv_size, $strong);
2, làm như vậy đòi hỏi không gian lưu trữ từ 33% đến 100%.

Giải mã

Giải mã các giá trị được lưu trữ là tương tự:

function pkcs7_unpad($data)
{
    return substr($data, 0, -ord($data[strlen($data) - 1]));
}

$row = $result->fetch(PDO::FETCH_ASSOC); // read from database result
// $enc_name = base64_decode($row['Name']);
// $enc_name = hex2bin($row['Name']);
$enc_name = $row['Name'];
// $iv = base64_decode($row['IV']);
// $iv = hex2bin($row['IV']);
$iv = $row['IV'];

$name = pkcs7_unpad(openssl_decrypt(
    $enc_name,
    'AES-256-CBC',
    $encryption_key,
    0,
    $iv
));

Mã hóa xác thực

Bạn có thể cải thiện thêm tính toàn vẹn của văn bản mật mã được tạo bằng cách nối thêm một chữ ký được tạo từ khóa bí mật (khác với khóa mã hóa) và văn bản mật mã. Trước khi văn bản mật mã được giải mã, chữ ký được xác minh đầu tiên (tốt nhất là với phương pháp so sánh thời gian không đổi).

Thí dụ

// generate once, keep safe
$auth_key = openssl_random_pseudo_bytes(32, $strong);

// authentication
$auth = hash_hmac('sha256', $enc_name, $auth_key, true);
$auth_enc_name = $auth . $enc_name;

// verification
$auth = substr($auth_enc_name, 0, 32);
$enc_name = substr($auth_enc_name, 32);
$actual_auth = hash_hmac('sha256', $enc_name, $auth_key, true);

if (hash_equals($auth, $actual_auth)) {
    // perform decryption
}

Chúng ta hãy mã hóa trường tên, sử dụng

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
5 và
$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
6 trước đó; Để làm điều này, chúng tôi phải chuyển dữ liệu của chúng tôi đến kích thước khối:

Yêu cầu lưu trữ

Đầu ra được mã hóa, như IV, là nhị phân; Lưu trữ các giá trị này trong cơ sở dữ liệu có thể được thực hiện bằng cách sử dụng các loại cột được chỉ định như

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
7 hoặc
$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
8.

Giá trị đầu ra, như IV, là nhị phân; Để lưu trữ các giá trị đó trong MYSQL, hãy xem xét sử dụng các cột

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
7 hoặc
$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe
8. Nếu đây không phải là một tùy chọn, bạn cũng có thể chuyển đổi dữ liệu nhị phân thành biểu diễn văn bản bằng cách sử dụng
$iv_size = 16; // 128 bits
$iv = openssl_random_pseudo_bytes($iv_size, $strong);
1 hoặc
$iv_size = 16; // 128 bits
$iv = openssl_random_pseudo_bytes($iv_size, $strong);
2, làm như vậy đòi hỏi không gian lưu trữ từ 33% đến 100%.

Giải mã

Giải mã các giá trị được lưu trữ là tương tự:

Mã hóa xác thực

  1. Bạn có thể cải thiện thêm tính toàn vẹn của văn bản mật mã được tạo bằng cách nối thêm một chữ ký được tạo từ khóa bí mật (khác với khóa mã hóa) và văn bản mật mã. Trước khi văn bản mật mã được giải mã, chữ ký được xác minh đầu tiên (tốt nhất là với phương pháp so sánh thời gian không đổi).
  2. Xem thêm:
    $iv_size = 16; // 128 bits
    $iv = openssl_random_pseudo_bytes($iv_size, $strong);
    
    3

Băm

Lưu trữ mật khẩu có thể đảo ngược trong cơ sở dữ liệu của bạn phải được tránh càng nhiều càng tốt; Bạn chỉ muốn xác minh mật khẩu thay vì biết nội dung của nó. Nếu người dùng mất mật khẩu, tốt hơn là cho phép họ đặt lại thay vì gửi cho họ bản gốc của họ (đảm bảo rằng đặt lại mật khẩu chỉ có thể được thực hiện trong một thời gian giới hạn).

Áp dụng hàm băm là hoạt động một chiều; Sau đó, nó có thể được sử dụng một cách an toàn để xác minh mà không tiết lộ dữ liệu gốc; Đối với mật khẩu, phương pháp vũ lực là một cách tiếp cận khả thi để khám phá nó do độ dài tương đối ngắn và lựa chọn mật khẩu kém của nhiều người.

$password = 'my password';
$random = openssl_random_pseudo_bytes(18);
$salt = sprintf('$2y$%02d$%s',
    13, // 2^n cost factor
    substr(strtr(base64_encode($random), '+', '.'), 0, 22)
);

$hash = crypt($password, $salt);

Các thuật toán băm như MD5 hoặc SHA1 đã được thực hiện để xác minh nội dung tệp so với giá trị băm đã biết. Chúng được tối ưu hóa rất nhiều để làm cho xác minh này nhanh nhất có thể trong khi vẫn chính xác. Với không gian đầu ra tương đối hạn chế của họ, thật dễ dàng để xây dựng cơ sở dữ liệu với mật khẩu đã biết và đầu ra băm tương ứng của chúng, các bảng cầu vồng.

Thêm một muối vào mật khẩu trước khi băm, nó sẽ khiến một chiếc bàn cầu vồng trở nên vô dụng, nhưng những tiến bộ phần cứng gần đây đã khiến cho việc tra cứu vũ lực trở thành một cách tiếp cận khả thi. Đó là lý do tại sao bạn cần một thuật toán băm cố tình chậm và đơn giản là không thể tối ưu hóa. Nó cũng có thể tăng tải cho phần cứng nhanh hơn mà không ảnh hưởng đến khả năng xác minh băm mật khẩu hiện tại để đưa ra bằng chứng trong tương lai.

Hiện tại có hai lựa chọn phổ biến có sẵn:

PBKDF2 (Chức năng dẫn xuất khóa dựa trên mật khẩu v2)

$given_password = $_POST['password']; // the submitted password
$db_hash = $row['Password']; // field with the password hash

$given_hash = crypt($given_password, $db_hash);

if (isEqual($given_hash, $db_hash)) {
    // user password verified
}

// constant time string compare
function isEqual($str1, $str2)
{
    $n1 = strlen($str1);
    if (strlen($str2) != $n1) {
        return false;
    }
    for ($i = 0, $diff = 0; $i != $n1; ++$i) {
        $diff |= ord($str1[$i]) ^ ord($str2[$i]);
    }
    return !$diff;
}

Để xác minh mật khẩu, bạn gọi lại

$iv_size = 16; // 128 bits
$iv = openssl_random_pseudo_bytes($iv_size, $strong);
8 nhưng bạn đã vượt qua băm được tính toán trước đó là giá trị muối. Giá trị trả về mang lại cùng một hàm băm nếu mật khẩu đã cho khớp với băm. Để xác minh hàm băm, thường được khuyến nghị sử dụng chức năng so sánh thời gian liên tục để tránh các cuộc tấn công thời gian.

Mật khẩu băm với PHP 5.5

Php 5.5 đã giới thiệu các hàm băm mật khẩu mà bạn có thể sử dụng để đơn giản hóa phương pháp băm trên:

________số 8

Và xác minh:

if (password_verify($given_password, $db_hash)) {
    // password valid
}

Xem thêm:

function pkcs7_pad($data, $size)
{
    $length = $size - strlen($data) % $size;
    return $data . str_repeat(chr($length), $length);
}

$name = 'Jack';
$enc_name = openssl_encrypt(
    pkcs7_pad($name, 16), // padded data
    'AES-256-CBC',        // cipher and mode
    $encryption_key,      // secret key
    0,                    // options (not used)
    $iv                   // initialisation vector
);
1,
function pkcs7_pad($data, $size)
{
    $length = $size - strlen($data) % $size;
    return $data . str_repeat(chr($length), $length);
}

$name = 'Jack';
$enc_name = openssl_encrypt(
    pkcs7_pad($name, 16), // padded data
    'AES-256-CBC',        // cipher and mode
    $encryption_key,      // secret key
    0,                    // options (not used)
    $iv                   // initialisation vector
);
2

Chúng ta có thể giải mã SHA256 trong PHP không?

SHA256 là một hàm băm, không phải là hàm mã hóa.Thứ hai, vì SHA256 không phải là hàm mã hóa, nó không thể được giải mã....it cannot be decrypted. ...

Sha256 được giải mã như thế nào?

SHA-256 là hàm băm mật mã (một chiều), do đó không có cách nào trực tiếp để giải mã nó.Toàn bộ mục đích của hàm băm mật mã là bạn không thể hoàn tác nó.Một điều bạn có thể làm là một chiến lược vũ lực, trong đó bạn đoán những gì đã được băm, sau đó băm nó với cùng một chức năng và xem nó có khớp không.there is no direct way to decode it. The entire purpose of a cryptographic hash function is that you can't undo it. One thing you can do is a brute-force strategy, where you guess what was hashed, then hash it with the same function and see if it matches.

Bạn có thể giải mã mật khẩu băm PHP không?

Giải mã mật khẩu: Để giải mã mật khẩu băm và truy xuất chuỗi gốc, chúng tôi sử dụng hàm password_verify ().Hàm password_verify () xác minh rằng băm đã cho khớp với mật khẩu đã cho, được tạo bởi hàm password_hash ().To decrypt a password hash and retrieve the original string, we use the password_verify() function. The password_verify() function verifies that the given hash matches the given password, generated by the password_hash() function.

Php có thể giải mã dữ liệu không?

PHP cho phép mã hóa và giải mã một chuỗi với một trong các phần mở rộng mật mã, được gọi là OpenSSL.Để ngắn gọn, nó có thể được sử dụng để mã hóa và giải mã dữ liệu.. To be short, it can be used to encrypt and decrypt data.