为了回答你的更多问题,当服务器被发出并且用一张好的证书正确配置后,你就不需要做任何其他事情了。
使用HTTPS
HTTPS 的工作原理是在初始握手期间通过向证书颁发机构(CA)验证 SSL 证书来进行。证书颁发机构,也就是用于验证这些证书的签名列表,通常会由操作系统供应商预加载。
假设你的服务器已经有了 CA 颁发的证书,那么你所需要做的就是在建立连接时从 HTTP 切换到 HTTPS。如果你正在使用的库没有自动为你执行此项操作,则应该有一种方法可以对服务器的 SSL 证书进行验证。
只要证书被强加密,就没有必要对将要通过 HTTPS 发送的任何内容进行加密。
另外,如果你想更深入地了解 HTTPS 的内部工作原理,请看 Information Security 上的这篇非常好的文章。
回答你最初的问题
为了完整起见。
PHP 具有加密扩展mcrypt,支持各种算法和密码操作模式。我编写了一个简单的示例,使用 AES 256 / PBKDF-SHA1 密钥解密(以及执行加密的 C# 代码)。
编辑:我想指出,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)
$salt = substr($data, $iv_size, $salt_size)
$extact = substr($data, $iv_size + $salt_size)
$key = hash_pbkdf2("sha1", $key, $salt, 1000, 32, true)
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $extact, MCRYPT_MODE_CBC, $iv)
}
// As an example, I've included this.
$encryped = "zgCp2sSDs32Y8SOn8MYFCEjOJDeM4E3Y8Wx52A+iTFRk/1TJwMzkqmrB06bFu8dK";
echo decode_aes(base64_decode($encryped), "password");
C#
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();
}
}
}
}
}