如何在PHP中没有硬编码密钥的情况下进行对称加密

Ale*_*ino 5 php encryption mcrypt

我正在使用PHP mcrypt库来MySQL使用AES 加密和存储()数据.

我想知道如果没有在我的代码中使用硬编码加密/解密密钥,是否有一种好方法可以做到这一点.

如果黑客能够访问我的服务器,他将能够在代码上看到文件和我的密钥,从而访问数据库上的所有数据.

谢谢.

Sco*_*ski 5

我正在使用PHP mcrypt库来MySQL使用AES 加密和存储()数据.

您可能希望重新考虑您在加密库中的选择.

我想知道如果没有在我的代码中使用硬编码加密/解密密钥,是否有一种好方法可以做到这一点.

将其存储在文档根目录之外的配置文件中?例如,defuse/php-encryption.

如果黑客能够访问我的服务器,他将能够在代码上看到文件和我的密钥,从而访问数据库上的所有数据.

如果黑客可以访问您的服务器,则对称密钥加密无法保存您.但是,公钥加密可以保护机密性.

使用Halite,这很容易解决:

  1. 您只能在服务器上加密; 从不解密.
  2. 您的密钥必须保持脱机状态并由人使用.

在线代码(假设PHP 7.0和Halite 2.1)

<?php
declare(strict_types=1);
use ParagonIE\Halite\{
    Asymmetric\Crypto as Asymmetric,
    KeyFactory
};

$publicKey = KeyFactory::loadEncryptionPublicKey("/path/to/public/key");
$encrypted = Asymmetric::seal("Whatever secret data we want", $publicKey);
// Now do whatever you need with $encrypted
Run Code Online (Sandbox Code Playgroud)

离线代码(假设PHP 7.0和Halite 2.1)

<?php
declare(strict_types=1);
use ParagonIE\Halite\{
    Asymmetric\Crypto as Asymmetric,
    KeyFactory
};

$salt = ""; // Generate from random_bytes(16) once, then persist.
$password = ""; // Create a strong password

$keyPair = KeyFactory::deriveEncryptionKeyPair($password, $salt);
$secretKey = $keyPair->getSecretKey();
$publicKey = $keyPair->getPublicKey();

// To have the public key to a file to upload to the server:
   KeyFactory::save($publicKey, '/path/to/public/key');

$decrypted = Asymmetric::unseal($encrypted, $secretKey);
Run Code Online (Sandbox Code Playgroud)