Openssl加密随机密钥和IV-存储在DB中

时间:2017-06-17 23:02:04

标签: php mysql encryption cryptography php-openssl

我已经阅读了很多关于加密的内容,并且知道自php 7以来已经出现了很多新的东西。我正在编写两个函数(encrypt和decrpyt)来将加密数据存储在我的数据库中。

我理解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安全,并将其附加到密码文本安全存储在数据库中?我正在存储一些敏感信息,并希望确保它是安全加密的。

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

任何反馈都会受到赞赏,因为我希望我的应用尽可能安全。注意我知道我必须采取更多安全措施来确保我的应用程序是安全的,我的问题是加密特定的。谢谢。

2 个答案:

答案 0 :(得分:1)

由于密钥存储在密文旁边,因此该方案不提供任何真正的安全性。相反,它是混淆。 通过默默无闻的安全一词适用于它。

请记住,密钥是唯一需要保密的部分。这被称为Kerckhoffs principle。通常假设攻击者能够在服务器被破坏时读取服务器端代码的源代码。在这种情况下,几乎不可能设计出一种密钥可以对攻击者保密的方案(想想硬件安全模块)。

当然,有不同类型的违规行为。当攻击者只能访问数据库记录而不实际获得Web服务器上的shell访问权限时,您可能会很幸运。除了可以从数据库查询任意信息的错误(想想SQL注入)之外,当Web应用程序没有正确地对请求进行身份验证和授权时,就会发生这种情况。 即使在这种情况下,攻击者也可以通过查看数据来了解数据是如何加密的(所有密文长度的统计数据都是一个很好的线索)。

答案 1 :(得分:0)

  1. 密钥和IV的随机字节是好的,IV加密数据的前缀是好的,两者都是安全的选择。

  2. 加密是基于字节的,它不关心任何编码,blob或其他。对于文本,将字节作为utf-8。

  3. 为什么选择XTS模式,它通常用于磁盘加密?见You Dont Want XTS。通常CBC或CTR模式是正确的选择。请注意,使用CBC时不会返回添加错误,CTR从不使用相同的IV(计数器初始值)和键 - 很容易出错。

  4. 最后,您打算如何保护加密密钥?这是困难的部分。