Hướng dẫn dùng cryptographically secure trong PHP - sử dụng mật mã an toàn trong PHP

Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password

Khi lưu trữ password vào CSDL thường sẽ sử dụng các hàm băm khác nhau được hỗ trợ bởi hệ CSDL hoặc ngôn ngữ lập trình [như MD5, SHA1 ...] để tạo dữ liệu mã hóa, dữ liệu mã hóa đó được lưu vào CSDL. Ví dụ:

Nội dung chính ShowShow

  • Tìm hiểu khi sử dụng các hàm băm tạo dữ liệu lưu trữ password
  • Sử dụng Salt tăng cường an toàn cho mật khẩu
  • Giải mã:
  • Cân nhắc thiết kế khác:
  • Quan trọng: Khi nào không sử dụng mã hóa
  • Ví dụ về mã hóa chuỗi PHP với Libsodium
  • Halite - Libsodium được tạo ra dễ dàng hơn
  • Ví dụ với mã hóa defuse / php
  • Quản lý khóa mã hóa
  • "Nhưng tôi thực sự muốn sử dụng mật khẩu."

$raw_password = 'abc123';
$crypt = md5[$raw_password]; //e99a18c428cb38d5f260853678922e03

Ví dụ trên, đã sử dụng hàm băm của PHP là

$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
0 để mã hóa password
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
1, kết quả mã hóa là
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
2

Bởi vì hàm băm tạo ra các giá trị không thể dịch ngược [không có thuật toán để giải giá trị hash

$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
2 là chuỗi
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
1, chỉ duy nhất một cách là thử], nên có cảm giác sẽ an toàn. Tuy nhiên với các mật khẩu yếu, nó có thể bị dò ra dựa trên giá trị băm của các mật khẩu phổ biến biết trước. Như trường hợp trên khi thấy
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
2 thì đoán được password là
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
1. Để khắc phục điều này có thể sử dụng đến salt

Sử dụng Salt tăng cường an toàn cho mật khẩu

Giải mã:

Cân nhắc thiết kế khác:

$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];

Quan trọng: Khi nào không sử dụng mã hóa

Ví dụ về mã hóa chuỗi PHP với Libsodiummã hóaxác thực , và tại sao bạn có thể muốn mã hóa được xác thực hơn là chỉ mã hóa .

Halite - Libsodium được tạo ra dễ dàng hơn

Ví dụ với mã hóa defuse / php

Quản lý khóa mã hóa ! Để bảo mật tốt nhất, hãy cập nhật hệ thống của bạn để sử dụng PHP 7.2 trở lên và chỉ làm theo lời khuyên libsodium trong câu trả lời này.

"Nhưng tôi thực sự muốn sử dụng mật khẩu."
Sử dụng mã hóa defuse / php ; không cuộn mật mã của riêng bạn!

Ví dụ trên, đã sử dụng hàm băm của PHP là

$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
0 để mã hóa password
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
1, kết quả mã hóa là
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
2

Bởi vì hàm băm tạo ra các giá trị không thể dịch ngược [không có thuật toán để giải giá trị hash

$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
2 là chuỗi
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
1, chỉ duy nhất một cách là thử], nên có cảm giác sẽ an toàn. Tuy nhiên với các mật khẩu yếu, nó có thể bị dò ra dựa trên giá trị băm của các mật khẩu phổ biến biết trước. Như trường hợp trên khi thấy
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
2 thì đoán được password là
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
1. Để khắc phục điều này có thể sử dụng đến salt

Để phức tạp hóa mật khẩu lưu trữ, thì các mật khẩu gốc trước khi mã hóa được nối thêm các chuỗi, các chuỗi thêm này gọi là
$raw_password = 'abc123';

//Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
$salt = random_bytes[32];

//Sử dụng thêm một salt cố định
$staticSalt = 'G4334#';


$crypt = md5[$staticSalt.$raw_password.$salt];
7

  1. Ví dụ:
  2. Giờ mật khẩu lưu trữ ở trên phức tạp hơn rất nhiều. Biết được
    $raw_password = 'abc123';
    
    //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
    $salt = random_bytes[32];
    
    //Sử dụng thêm một salt cố định
    $staticSalt = 'G4334#';
    
    
    $crypt = md5[$staticSalt.$raw_password.$salt];
    
    8 đoán ra
    $raw_password = 'abc123';
    
    //Sinh ra chuỗi dài 32 ngẫu nhiên, cũng cần lưu chuỗi này vào một cột trong DB
    $salt = random_bytes[32];
    
    //Sử dụng thêm một salt cố định
    $staticSalt = 'G4334#';
    
    
    $crypt = md5[$staticSalt.$raw_password.$salt];
    
    9 là rất khó, kể cả khi là password yếu. Khó mà xây dựng được một từ điển chứa các mã hóa tương ứng với password.MAC nên bao phủ IV cũng như bản mã!

Giải mã:

  1. Cân nhắc thiết kế khác:
  2. Quan trọng: Khi nào không sử dụng mã hóa

Cân nhắc thiết kế khác:

  1. Quan trọng: Khi nào không sử dụng mã hóa
  2. Ví dụ về mã hóa chuỗi PHP với Libsodium
  3. Halite - Libsodium được tạo ra dễ dàng hơnKHÔNG SỬ DỤNG

Bài Viết Liên Quan

Chủ Đề