2017-06-17 61 views
2

我已经阅读了很多关于加密和认识了很多新的东西已经出来了,因为PHP 7.我写两个功能(加密和decrpyt)存储在我的数据库加密的数据。OpenSSL编成密码随机密钥和IV-存放在DB

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

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

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

回答

0
  1. 对于密钥和IV的随机字节是好的,将IV加到加密数据的前面是好的,两者都是安全的选择。

  2. 加密是基于字节,它不关心任何编码,BLOB或其他方式。对于文本获取字节为utf-8。

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

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

+0

这真的是我的问题吗?我无法找到存储密钥的行业标准。没有人有关于如何/在哪里存储密钥的建议? – user982853

+0

存储和保护密钥显然很重要,加密不会比密钥更安全。关键存储没有行业标准。您需要根据您的威胁模型确定所需的安全级别。攻击者的范围从阻止好奇到挫败的民族国家。选项可以从便笺,配置文件以及高端HSM中的物理安全位置运行。 – zaph

1

由于密钥存储在密文旁边,因此该方案不提供任何真正的安全性。相反,这是混淆。通过隐藏的安全性术语将适用于它。

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

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