Ответ 1
Чтобы ответить на ваши дальнейшие вопросы, когда сервер выпущен и правильно настроен с хорошим сертификатом, вам больше не нужно ничего делать.
Использование HTTPS
HTTPS работает, проверяя сертификаты SSL с центром сертификации (CA) во время первоначального рукопожатия. Органы сертификации, которые по существу являются списком подписей, которые используются для проверки указанных сертификатов, обычно поставляются с предустановленной производителем ОС.
Предполагая, что у вашего сервера есть сертификат, выданный CA, все, что вам нужно будет сделать, это изменить с использованием HTTP на HTTPS при подключении. Библиотека, которую вы используете, должна иметь метод проверки SSL-сертификата серверов, если он автоматически не сделает это для вас.
Нет никаких технических причин, по которым вам нужно будет шифровать все, что будет отправлено через HTTPS, если сертификат сильно зашифрован.
Кроме того, если вы хотите углубиться в подробные подробности о том, как работает HTTPS, этот очень хороший пост в отношении информационной безопасности, который немного проливает свет на внутреннюю работу протокола.
Чтобы ответить на ваш первоначальный вопрос
Для полноты.
В PHP есть расширение криптографии mcrypt, которое поддерживает различные алгоритмы и режимы работы шифрования. Я собрал простой пример, используя дешифрование ключа AES 256/PBKDF-SHA1 (вместе с кодом С# для выполнения шифрования).
EDIT: Я хотел бы указать, что hash_pbkdf2 доступен только в PHP 5.5 и выше. Поддержка до 5.3 может быть добавлена с этот отличный трюк.
PHP
function decode_aes($data, $key) // Decrypt custom format data string
{
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$salt_size = 16;
$iv = substr($data, 0, $iv_size); // Init vector
$salt = substr($data, $iv_size, $salt_size); // The salt
$extact = substr($data, $iv_size + $salt_size); // This is the encrypted data
$key = hash_pbkdf2("sha1", $key, $salt, 1000, 32, true); // Sets to use PBKDF-SHA1
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $extact, MCRYPT_MODE_CBC, $iv); // Perform the decryption with the extracted sections
}
// As an example, I've included this.
$encryped = "zgCp2sSDs32Y8SOn8MYFCEjOJDeM4E3Y8Wx52A+iTFRk/1TJwMzkqmrB06bFu8dK";
echo decode_aes(base64_decode($encryped), "password");
С#
using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace AESExample
{
class Program
{
static void Main(string[] args)
{
byte[] toEncrypt = Encoding.UTF8.GetBytes("Encrypted Text");
byte[] key = Encoding.UTF8.GetBytes("password");
String encrypted = Convert.ToBase64String(EncryptAES(toEncrypt, key));
}
public static byte[] EncryptAES(byte[] data, byte[] key)
{
using(RijndaelManaged algo = new RijndaelManaged())
{
algo.GenerateIV();
algo.Mode = CipherMode.CBC;
algo.Padding = PaddingMode.Zeros;
byte[] saltBuffer = new byte[16];
RNGCryptoServiceProvider saltGenerator = new RNGCryptoServiceProvider();
saltGenerator.GetBytes(saltBuffer);
Rfc2898DeriveBytes PBKDF2 = new Rfc2898DeriveBytes(key, saltBuffer, 1000);
key = PBKDF2.GetBytes(32);
ICryptoTransform cipher = algo.CreateEncryptor(key, algo.IV);
using(MemoryStream ms = new MemoryStream())
{
ms.Write(algo.IV, 0, algo.IV.Length);
ms.Write(saltBuffer, 0, saltBuffer.Length);
using(CryptoStream cs = new CryptoStream(ms, cipher, CryptoStreamMode.Write))
{
using(StreamWriter sw = new StreamWriter(cs))
{
sw.Write(Encoding.UTF8.GetString(data).ToCharArray());
}
}
return ms.ToArray();
}
}
}
}
}