我正在寻找加密安全数据,例如社会安全号码,但是会有其他人(例如我的网络主机,员工)可以完全访问加密的源代码。是否可以使用不需要包含在原始源中的密钥以某种方式加密,这样只有我(谁知道密钥)才能解密?
3 回答
按照你的想法,不,做不到。不,只是说“非对称加密”也无济于事。当某些操作将累积在这些数据上(由合法用户)时,您必须解密它们,并且无论您的解密密钥存储在哪里,您的代码都会尝试访问它(这意味着服务器上的任何管理员都可以访问它也)。
当然,如果您想以半永久性方式加密客户的数据(用户将无法再次更改或读取数据),那么是的,建议与您(开发人员)进行非对称加密的人保留私钥秘密,100% 正确。
一种方法如下:
用户注册:生成密钥对(私人和公共)将公共存储在数据库中,用用户密码的哈希加密私人并将其存储在数据库中。现在再次散列哈希密码并将其存储在数据库中。
用户输入敏感数据:获取输入并使用数据库中的公钥对其进行加密(按照 Hugo 的建议,使用用户的密码作为该过程的密码)并将其存储在数据库中。
用户访问/编辑他的信息:取用户密码,哈希2次并认证他,然后如果他是合法用户,则使用第一个哈希解密私钥并使用私钥解密数据(使用用户密码作为进程的密码)。
请记住,没有 100% 的安全性,请采纳这个想法并加以改进。
更新:我和一位在支付处理公司工作的朋友交谈,他描述了现实生活中的情况如下:
没有办法,运行服务器的人总是可以访问数据,无论是否加密。您必须将私钥保存在某个地方。我们将 SSN 和信用卡号保存在单独服务器上的单独数据库中,该服务器具有物理安全性,并且只允许授权人员访问该服务器。除了在同一台服务器上使用脚本外,我们不会查询安全数据库,这些脚本为我们提供了处理所有付款的最低限度的 API。在我们的纯文本数据库中,我们仅保留部分信息 (XXXX-XXXX-XXXX-4569) 仅供查看。所有编辑、读取、附加、添加、删除都通过 API 发生在该安全服务器(安全软件、上锁的门、安全摄像头)上。
最简洁的答案是不。
但是,您可以使用非对称密钥,例如 GPG 密钥(或 SSL 密钥)。
你有一个私钥和公钥。公钥用于加密,私钥用于解密。您可以在源代码中包含公钥,并且只保留您自己的私钥。
你可以使用mcrypt
示例编码:
$key = "mykey";
$data = "my data";
$enc_data = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_ECB, md5($key));
示例解码:
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $enc_data, MCRYPT_MODE_ECB);
$key 可以在源代码之外给出,也可以通过 html 表单记住和给出。