Php Openssl加密随机密钥&;IV-存储在数据库中

Php Openssl加密随机密钥&;IV-存储在数据库中,php,mysql,encryption,cryptography,php-openssl,Php,Mysql,Encryption,Cryptography,Php Openssl,我已经读了很多关于加密的书,并且知道自从PHP7以来有很多新的东西问世。我正在编写两个函数(encrypt和decrypyt)来将加密数据存储在数据库中 我了解openssl函数是如何工作的,但我想知道我是否正确地将它存储在数据库中,或者说是否应该安全地存储它。我的代码如下: function wm_encryptString($string) { $method = 'aes-256-xts'; $key = random_bytes(16); $iv = random

我已经读了很多关于加密的书,并且知道自从PHP7以来有很多新的东西问世。我正在编写两个函数(encrypt和decrypyt)来将加密数据存储在数据库中

我了解openssl函数是如何工作的,但我想知道我是否正确地将它存储在数据库中,或者说是否应该安全地存储它。我的代码如下:

function wm_encryptString($string) {
    $method = 'aes-256-xts';
    $key = random_bytes(16);
    $iv = random_bytes(16);
    $cipherText = openssl_encrypt($string, $method, $key, 0, $iv);
    $cipherText = $key.$iv.$cipherText;
    $cipherText = base64_encode($cipherText);
    return $cipherText;
}

function wm_decryptString($cipher) {
    $cipher = base64_decode($cipher);
    $method = 'aes-256-xts';
    $key = substr($cipher, 0, 16);
    $iv = substr($cipher, 16, 16);
    $cipher = substr($cipher, 32);
    $readableText = openssl_decrypt($cipher, $method, $key, 0, $iv);
    return $readableText;
}
当我运行这两个函数时,它可以很好地进行加密和解密。我的具体问题是,是否使用随机字节生成密钥和IV secure,并将其附加到密码文本secure以存储在db中?我正在存储一些敏感信息,希望确保这些信息被安全加密

我的第二个问题是,我知道我可以使用这些函数加密字符串,但是我可以使用相同的函数加密blob吗?我在我的数据库中存储了一些文档(我知道你们中的许多人会说永远不要在数据库中存储文档,但我使用数据库,因为我只存储了少数文档,少于100个,这使备份更容易)。我可以使用相同的函数加密blob/文件吗

任何反馈都将不胜感激,因为我希望我的应用程序尽可能安全。注意:我知道我必须采取更多的安全措施来确保我的应用程序是安全的,我的问题是针对加密的。多谢各位

  • 密钥和IV的随机字节是好的,将IV作为加密数据的前缀是好的,两者都是安全的选择

  • 加密是基于字节的,它不关心任何编码、blob或其他。对于文本,获取utf-8形式的字节

  • 为什么选择XTS模式,它通常用于磁盘加密?看见通常,CBC或CTR模式是正确的选择。注意,对于CBC,不要返回加法错误,对于CTR,永远不要使用相同的IV(计数器初始值)和键–很容易出错


  • 最后,您计划如何保护加密密钥?这是最难的部分。

    因为密钥存储在密文旁边,所以该方案不能提供任何真正的安全性。相反,这是混淆。默默无闻的安全一词将适用于它

    请记住,钥匙是唯一需要保密的部分。这就是我们所知道的。通常认为,当服务器被破坏时,攻击者能够读取服务器端代码的源代码。在这种情况下,几乎不可能设计一种方案,使密钥对攻击者保密(想想硬件安全模块)

    当然,有不同类型的违规行为。如果攻击者只访问数据库记录,而没有实际访问web服务器上的shell,那么您可能会很幸运。当web应用程序没有正确地对请求进行身份验证和授权时,可能会发生这种情况。此外,还存在一个bug,可以从数据库中查询任意信息(想想SQL注入)。

    即使在这种情况下,攻击者也可以通过查看数据(所有密文长度的统计数据是一个很好的线索)了解数据是如何加密的。

    这真的是我的问题吗?我找不到必须按照行业标准储存钥匙的方法。没有人对如何/在哪里存储密钥有建议吗?存储和保护密钥显然很重要,加密并不比密钥更安全。密钥存储没有行业标准。您需要在威胁模型中确定所需的安全级别基础。袭击者的范围从阻止好奇者到挫败民族国家。在物理安全位置的高端HSM上,可通过post说明、配置文件和配置文件运行选项。