我确定有一个简单的答案,我提前为长期问题道歉,但我是加密的新手,谷歌搜索了好几天或几乎没有用。我在这里使用PHP和Defuse加密/解密框架:https://github.com/defuse/php-encryption
我想使用此框架在一个PHP文件中使用随机生成的密钥加密用户输入的数据,然后能够访问加密信息并稍后在另一个PHP文件中解密。我可以使用会话或将加密数据存储在数据库中,但我的问题是:当用户以后再次访问时,我应该如何安全地存储密钥来解密数据?如果我错误地认为将密钥存储在会话或某种表中会破坏加密的目的,请纠正我。
例如,输入敏感数据的文件可能如下所示(不包括任何错误处理等):
<?php
/* file1.php */
/* stuff to load in encryption framework */
use \Defuse\Crypto\Crypto;
use \Defuse\Crypto\Exception as Ex;
require_once 'autoload.php';
/* string to be encrypted */
$data = "Sensitive Data";
/* create a random key */
$key = Crypto::createNewRandomKey();
/* create the encrypted ciphertext */
$ciphertext = Crypto::encrypt($data, $key);
/* store the encrypted data somewhere (database, session, etc)
with some sort of function I have made made */
storeEncryptedData($ciphertext);
?>
然后,用户稍后返回该站点并需要访问数据:
<?php
/* file2.php */
/* stuff to load in encryption framework */
use \Defuse\Crypto\Crypto;
use \Defuse\Crypto\Exception as Ex;
require_once 'autoload.php';
/* retrieve the encrypted data from wherever I stored it earlier */
$encrypted = retrieveEncryptedData();
/* don't know where to go from here */
?>
所以现在我在file2中有加密数据,我的理解是我需要知道在file1中生成的密钥来解密它。我见过的所有示例都在同一个代码文件中加密和解密数据,这意味着我需要一些方法来安全地将密钥从file1传递到file2。有没有办法在不破坏加密数据的目的的情况下做到这一点?
我还应该回答Isaac Raway的回复,由于我无法管理访问此应用程序的客户端工作站,我希望密钥不会存储在客户端计算机上。
答案 0 :(得分:1)
您应该允许用户下载密钥以便安全保存,并将其存储在cookie中,并允许他们在密钥不在cookie中时返回时选择密钥文件由于会话过期而返回。
通过这种方式,密钥不会存储在磁盘上,也不会永久存储在服务器的内存中,但仍会随着每个请求一起作为cookie头发送,以便您的代码可以进行加密工作。请注意,这并不是真正有资格作为零知识,因为您仍然将密钥发送回服务器,但它比典型的Web应用程序更安全。
对于真正的零知识,请考虑使用经过良好测试的JS库实现加密。您仍然可以允许用户复制密钥以便安全保存并将其粘贴回来。在这种情况下,使用本地存储而不是cookie来存储密钥。
另外,请确保在没有SSL的情况下在您的网站上请求任何内容并将您的Cookie设置为仅安全的Cookie是非常不可能的。无论您使用何种方法,这都非常重要。