Upgraded php and needed something to replace insecure legacy mcrypt libs, but still supported classic user, password interface.
function encrypt[$plaintext, $key, $cipher = "aes-256-gcm"] {
if [!in_array[$cipher, openssl_get_cipher_methods[]]] {
return false;
}
$iv = openssl_random_pseudo_bytes[openssl_cipher_iv_length[$cipher]];
$tag = null;
$ciphertext = openssl_encrypt[
gzcompress[$plaintext],
$cipher,
base64_decode[$key],
$options=0,
$iv,
$tag,
];
return json_encode[
array[
"ciphertext" => base64_encode[$ciphertext],
"cipher" => $cipher,
"iv" => base64_encode[$iv],
"tag" => base64_encode[$tag],
]
];
}
function decrypt[$cipherjson, $key] {
try {
$json = json_decode[$cipherjson, true, 2, JSON_THROW_ON_ERROR];
} catch [Exception $e] {
return false;
}
return gzuncompress[
openssl_decrypt[
base64_decode[$json['ciphertext']],
$json['cipher'],
base64_decode[$key],
$options=0,
base64_decode[$json['iv']],
base64_decode[$json['tag']]
]
];
}
$secret = "MySecRet@123";
$cipherjson = encrypt["Hello world!\n", $secret];
echo decrypt[$cipherjson, $secret];
?>
SSL/SSH bảo vệ dữ liệu di chuyển từ máy khách đến máy chủ. SSL/SSH không bảo vệ dữ liệu liên tục được lưu trữ trong cơ sở dữ liệu. SSL là một giao thức on-the-wire
Khi kẻ tấn công có quyền truy cập trực tiếp vào cơ sở dữ liệu của bạn [bỏ qua máy chủ web], dữ liệu nhạy cảm được lưu trữ có thể bị lộ hoặc sử dụng sai, trừ khi thông tin được bảo vệ bởi chính cơ sở dữ liệu. Mã hóa dữ liệu là một cách tốt để giảm thiểu mối đe dọa này, nhưng rất ít cơ sở dữ liệu cung cấp loại mã hóa dữ liệu này
Cách dễ nhất để giải quyết vấn đề này trước tiên là tạo gói mã hóa của riêng bạn, sau đó sử dụng gói đó từ bên trong tập lệnh PHP của bạn. PHP có thể hỗ trợ bạn trong việc này với một số tiện ích mở rộng, chẳng hạn như OpenSSL và Natri, bao gồm nhiều thuật toán mã hóa. Tập lệnh mã hóa dữ liệu trước khi đưa vào cơ sở dữ liệu và giải mã khi truy xuất. Xem các tài liệu tham khảo để biết thêm ví dụ về cách hoạt động của mã hóa
băm
Trong trường hợp dữ liệu thực sự ẩn, nếu biểu diễn thô của nó là không cần thiết [i. e. sẽ không được hiển thị], băm nên được xem xét. Ví dụ nổi tiếng về băm là lưu trữ hàm băm mật mã của mật khẩu trong cơ sở dữ liệu, thay vì chính mật khẩu đó
Các hàm mật khẩu cung cấp một cách thuận tiện để băm dữ liệu nhạy cảm và làm việc với các hàm băm này
password_hash[] được sử dụng để băm một chuỗi nhất định bằng thuật toán mạnh nhất hiện có và password_verify[] kiểm tra xem mật khẩu đã cho có khớp với hàm băm được lưu trữ trong cơ sở dữ liệu hay không
Chức năng này hoạt động khác nhau trên các hệ điều hành khác nhau. PHP kiểm tra thuật toán nào có sẵn và sử dụng thuật toán nào khi nó được cài đặt
Tham số muối là tùy chọn. Tuy nhiên, crypt[] tạo mật khẩu yếu mà không có muối. Đảm bảo chỉ định một loại muối đủ mạnh để bảo mật tốt hơn
Có một số hằng số được sử dụng cùng với hàm crypt[]. Giá trị của các hằng số này được thiết lập bởi PHP khi nó được cài đặt
hằng số
- [CRYPT_STD_DES] - Băm dựa trên DES tiêu chuẩn với muối hai ký tự từ bảng chữ cái ". /0-9A-Za-z". Sử dụng các ký tự không hợp lệ trong muối sẽ khiến chức năng này không thành công
- [CRYPT_EXT_DES] - Hàm băm dựa trên DES mở rộng với muối chín ký tự bao gồm dấu gạch dưới theo sau là 4 byte số lần lặp và 4 byte muối. Chúng được mã hóa dưới dạng các ký tự có thể in được, 6 bit cho mỗi ký tự, ký tự ít quan trọng nhất trước tiên. Các giá trị từ 0 đến 63 được mã hóa thành ". /0-9A-Za-z". Sử dụng các ký tự không hợp lệ trong muối sẽ khiến chức năng bị lỗi
- [CRYPT_MD5] - Băm MD5 với muối 12 ký tự bắt đầu bằng $1$
- [CRYPT_BLOWFISH] - Băm Blowfish với muối bắt đầu bằng $2a$, $2x$ hoặc $2y$, tham số chi phí gồm hai chữ số "$" và 22 ký tự trong bảng chữ cái ". /0-9A-Za-z". Sử dụng các ký tự bên ngoài bảng chữ cái sẽ khiến hàm này trả về một chuỗi có độ dài bằng không. Tham số "$" là logarit cơ số 2 của số lần lặp cho thuật toán băm Blowfish-bashed cơ bản và phải nằm trong phạm vi 04-31. Các giá trị nằm ngoài phạm vi này sẽ khiến chức năng bị lỗi
- [CRYPT_SHA_256] - Băm SHA-256 với muối 16 ký tự bắt đầu bằng $5$. Nếu chuỗi muối bắt đầu bằng "rounds=$", giá trị số của N được sử dụng để cho biết số lần vòng lặp băm sẽ được thực thi, giống như tham số chi phí trên Blowfish. Số vòng mặc định là 5000, tối thiểu là 1000 và tối đa là 999.999.999. Mọi lựa chọn N nằm ngoài phạm vi này sẽ bị cắt bớt đến giới hạn gần nhất
- [CRYPT_SHA_512] - Hàm băm SHA-512 với muối 16 ký tự bắt đầu bằng $6$. Nếu chuỗi muối bắt đầu bằng "rounds=$", giá trị số của N được sử dụng để cho biết số lần vòng lặp băm sẽ được thực thi, giống như tham số chi phí trên Blowfish. Số vòng mặc định là 5000, tối thiểu là 1000 và tối đa là 999.999.999. Mọi lựa chọn N nằm ngoài phạm vi này sẽ bị cắt bớt đến giới hạn gần nhất
Trên các hệ thống mà chức năng này hỗ trợ nhiều thuật toán, các hằng số ở trên được đặt thành "1" nếu được hỗ trợ và "0" nếu không