我使用PHP mcrypt
库来使用AES加密和存储(MySQL
)数据。
我想知道在我的代码中没有硬编码加密/解密密钥的情况下是否有一个好方法。
如果黑客能够访问我的服务器,他将能够在代码上看到文件和我的密钥,从而访问数据库中的所有数据。
感谢。
答案 0 :(得分:5)
我使用PHP
mcrypt
库来使用AES加密和存储(MySQL
)数据。
You may wish to reconsider your choice in cryptography library
我想知道在我的代码中没有硬编码加密/解密密钥的情况下是否有一个好方法。
将其存储在文档根目录之外的配置文件中?例如,defuse/php-encryption。
如果黑客能够访问我的服务器,他将能够在代码上看到文件和我的密钥,从而访问数据库中的所有数据。
如果黑客可以访问您的服务器,symmetric-key encryption cannot save you。但是,公钥加密可以保护机密性。
使用Halite,这很容易解决:
<?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
<?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);
答案 1 :(得分:1)
这取决于你愿意去的长度和你的环境。
将解密密钥保存在数据库中绝对是一个坏主意 - 如果有人掌握了数据库,他们将同时拥有解密密钥和数据。通过将其存储在应用程序服务器上,您可以确定不会发生上述情况。但是如果有人访问应用程序服务器,然后通过应用程序服务器访问数据库呢?现在他们再次拥有密钥和数据。但是你已经说过这么多了。
由于您没有提及您的环境,我们假设:
您可以拥有一个简单的Apache配置文件:
然后在部署期间:
在此之后,事物的当前状态将是:
你如何仍然容易受到攻击:
但是,它比将未加密的密钥存储在应用程序服务器上要安全得多,而且需要一个非常复杂且高度复杂的攻击者来利用它。所以,正如我在开头所说,这取决于你想要去的长度。