Mã hóa RSA là mã hóa bất đối xứng. Mã hóa đối xứng là dùng chung KEY để mã hóa và giải mã. Mã hóa bất đối xứng là mã hóa bằng 1 KEY, giải mã bằng 1 KEY khác.
Mã hóa đối xứng mà anh em dev thường gặp khi làm việc với các API là DES, 3DES và AES. Trong đó AES là tân tiến nhất.
Thuật toán mã hóa bị coi là không an toàn khi có máy tính (siêu máy tính) giải mã được trong thời gian ngắn (5 năm cũng là ngắn!!!). Về lý thuyết KEY để mã hóa càng dài thì càng an toàn nhưng lại làm chậm quá trình tính toán để mã hóa và giải mã kết quả khi dữ liệu là lớn nên thường sẽ có vài lựa chọn để tối ưu trong từng trường hợp.
Trong Thông tư số 01/2011/TT-BTTTT ngày 04/01/2011 của Bộ Thông tin và Truyền thông Công bố Danh mục tiêu chuẩn kỹ thuật về ứng dụng công nghệ thông tin trong cơ quan nhà nước quy định Khuyến nghị áp dụng tiêu chuẩn AES và được xếp vào nhóm Tiêu chuẩn về an toàn thông tin
RSA dùng public key để mã hóa dữ liệu và dùng private key để giải mã dữ liệu đã mã hóa. Độ dài KEY thường là 1024 bit, 2048 bit, 4096 bit
Sinh cặp KEY để mã hóa RSA:
openssl genrsa -out rsa.private 1024
openssl rsa -in rsa.private -pubout -out rsa.public
Lúc này có 2 file rsa.private => là private key, phải giữ như giữ vàng, không cho ai biết. rsa.public => là public key, gửi cho đối tác, anh em, bạn bè, thằng ất ơ trên mạng cũng được
Áp dụng:
Sign: (bằng private key)
openssl_sign($data, $sign, openssl_pkey_get_private($keyPrivate), OPENSSL_ALGO_SHA256);
$signFinal = base64_encode($sign);
Verify: (bằng public key)
$ok = openssl_verify($data, base64_decode($signFinal), openssl_pkey_get_public($keyPublic), OPENSSL_ALGO_SHA256); # return true or false
Mã hóa: (bằng public key)
openssl_public_encrypt($data, $crypted, $public_key, OPENSSL_PKCS1_PADDING);
Giải mã: (bằng private key)
openssl_private_decrypt($data, $decrypted, $private_key, OPENSSL_PKCS1_PADDING);
Khi mình triển khai API cho đối tác và có dùng RSA để bảo mật dữ liệu thì mình sẽ verify dữ liệu đối tác gửi lên và mã hóa thông tin nhạy cảm trả về, còn đối tác sẽ sign dữ liệu gừi lên và giải mã thông tin nhạy cảm nhận được