PHP、MySQL和AES用户数据加密/解密

PHP、MySQL和AES用户数据加密/解密,php,mysql,encryption,aes,Php,Mysql,Encryption,Aes,我不熟悉AES加密,但正在尝试构建一个解决方案: 接受消费者数据 使用AES和 “公开”密钥 将该数据存储在MySQL数据库中 具有拉取和解密的能力 仅使用私钥存储数据 (存储在我的个人电脑上,而不是 服务器本身) 我意识到这可能有些过分,但我想对我的消费者数据进行过度保护 需要注意的几点: 这不是信用卡信息 所以请不要写信告诉我 关于PCI-DSS,它是另一种形式的 个人信息均在500以下 每个字段的长度为个字符 我可以储存消费者的物品 信息和其他 数据库由一个唯一的 额外安全性的成员ID

我不熟悉AES加密,但正在尝试构建一个解决方案:

  • 接受消费者数据
  • 使用AES和 “公开”密钥
  • 将该数据存储在MySQL数据库中
  • 具有拉取和解密的能力 仅使用私钥存储数据 (存储在我的个人电脑上,而不是 服务器本身)
我意识到这可能有些过分,但我想对我的消费者数据进行过度保护

需要注意的几点:

  • 这不是信用卡信息 所以请不要写信告诉我 关于PCI-DSS,它是另一种形式的 个人信息均在500以下 每个字段的长度为个字符
  • 我可以储存消费者的物品 信息和其他 数据库由一个唯一的 额外安全性的成员ID
  • 传入的MySQL调用只能是 直接从我的 静态IP
  • SSH根目录已禁用,端口已更改, 等等,所以我觉得我的服务器在 保持良好的体形,以防止任何伤害 “基本”滥用
  • 我在网上找了一些文章,但是没有找到多少关于完全不让私钥进入服务器的内容。即使我需要继续使用服务器本身,对于如何向前发展的想法或建议也非常感谢

    编辑-澄清 更清楚地说,我试图实现的目标是(以非常基本的形式):

    • 客户输入其电话号码 在线

    • 输入的电话号码是加密的 使用密钥A联机并存储在 mysql数据库

    • 客户将永远无法 在这里再次看到完整的电话 点,但肯定可以更新它 (第n步通过关键流程) 时间)

    • 作为一名系统管理员,我只能通过在本地计算机上下载和解密数据来访问数据(或者我必须首先上载一个临时文件,该文件用于解密我需要的数据)
    编辑2-我是个白痴 我正在使用下面Andrew Cooper的响应,但在让脚本读取我生成的.pem文件的内容时遇到了问题。基于下面的代码-如何获得$public key以对应于服务器上的特定.pem文件

    <?php
    
    if (isset($_SERVER['HTTPS']) )
    {
        echo "SECURE: This page is being accessed through a secure connection.<br><br>";
    }
    else
    {
        echo "UNSECURE: This page is being access through an unsecure connection.<br><br>";
    }
    
    
    // Create the keypair
    $res=openssl_pkey_new();
    
    // Get private key
    openssl_pkey_export($res, $privatekey);
    
    // Get public key
    $publickey=openssl_pkey_get_details($res);
    $publickey=$publickey["key"];
    
    echo "Private Key:<BR>$privatekey<br><br>Public Key:<BR>$publickey<BR><BR>";
    
    $cleartext = '1234 5678 9012 3456';
    
    echo "Clear text:<br>$cleartext<BR><BR>";
    
    openssl_public_encrypt($cleartext, $crypttext, $publickey);
    
    echo "Crypt text:<br>$crypttext<BR><BR>";
    
    openssl_private_decrypt($crypttext, $decrypted, $privatekey);
    
    echo "Decrypted text:<BR>$decrypted<br><br>";
    ?>
    
    
    
    编辑3-也许不是“白痴”,但分号讨厌我
    我把分号放错地方了。我正在使用函数:file\u get\u contents(),但是有没有更喜欢的方法来读取.pem文件的数据?

    。。。我觉得这不可能。MySQL的AES_解密方法需要编码的消息和原始密钥才能解密某些内容。这意味着任何可以获得加密密钥的人都可以解密消息。

    您应该能够在个人计算机上生成公钥/私钥对,然后在应用程序中发布公钥,以便对数据进行加密。这样,服务器就永远看不到私钥,如果服务器被黑客攻击,数据仍然是安全的

    您需要确保整个事务通过SSL进行。客户端可以生成一个随机会话密钥,使用该密钥加密数据(使用AES),然后使用应用程序中的公钥加密密钥(使用RSA),然后将加密的数据和密钥发送到服务器。您可以将整个blob存储在一个或两个数据库字段中。解密数据的唯一方法是先解密密钥,唯一的方法是在个人计算机上使用私钥

    更新

    退房。它是一个JQuery插件,似乎允许这种类型的场景。我没有使用它的经验,但在我看来这是一个好的开始

    新更新

    为了明确我的建议,并解决您的编辑问题:

    不能只使用AES加密。对于AES,有一个密钥用于加密和解密。密钥必须存在于加密操作发生的任何地方,无论是在客户端代码中,还是在web服务器上。在第一种情况下,任何人都可以得到你的钥匙。在第二种情况下,如果web服务器被破坏,那么密钥和数据也有风险

    解决方案是将良好、强大的AES加密与公钥加密(RSA)结合使用。我建议在客户端处理加密,原因我将在下面概述。不过,以下是我建议的步骤:

  • 在您的专用计算机上创建公钥/私钥对,并确保私钥的安全
  • 将公钥放在发送给客户端的代码中的某个位置
  • 当用户提交表单时,客户端代码:
  • 生成随机AES密钥(会话密钥)
  • 加密表单数据
  • 使用公钥和RSA算法加密会话密钥
  • 丢弃明文会话密钥
  • 将加密的表单数据和加密的会话密钥发送到服务器
  • 服务器接受加密的表单数据,并将其与加密密钥一起存储在数据库中
  • 现在,数据库中已加密数据,只能使用存储在专用计算机上的私钥检索这些数据。即使用户设法在会话密钥在其机器上处于清除状态时捕获该会话密钥,也可能发生的最坏情况是一条记录可能被解密

    我建议使用这种客户端方法的原因是,这意味着您的服务器永远看不清加密密钥。如果在服务器端使用相同的方案,那么理论上,攻击者可能会坐在您的服务器上监视它的发生。归根结底,这基本上取决于你有多偏执

    按照这个方案,当您想要检索数据时,您会以加密的形式将所需的数据从数据库转储到您的专用计算机。对于加密数据的每个数据块:

  • 使用RSA算法和您的私钥解密会话密钥