题
我一直在使用 PHP mcrypt 模块来加密我公司的敏感数据。这一直运作良好。但是,我被要求创建一个新的主密码,该密码应该能够解密任何数据。问题是这个主密码必须硬编码在脚本文件中。如果我错了,请纠正我,但唯一安全的方法似乎是在脚本中硬编码公钥并使用它来加密数据,同时保持私钥安全并仅在需要时使用它来解密。
mcrypt 似乎没有这种方案的实现。有人知道有一个库(PHP 模块或纯 PHP)可以做到这一点吗?
解决方案
我建议采取看看PHP OpenSSL的绑定,并且特别是 openssl_public_encrypt()函数。事实上,你可以嵌入主公开密钥插入脚本,该脚本加密这个公钥每个用户的AES密钥。请该公司相应的主私钥的安全。
如果您需要主解密函数,你会拉加密的用户密钥,与主私钥进行解密,然后解密原始数据。
其他提示
有一个PECL扩展了点。 http://us2.php.net/manual/en/book.gnupg。 PHP
您也可以从PHP使用GnuPG命令行工具,如果它没有非常快:的 http://devzone.zend.com/article/1265
我还没有尝试任何一种方法。
我不明白怎么会工作。任何双向加密功能只会饲喂时用来加密(除非你是国家安全局,你把后门的算法)的具体密码解密。你不能有两个密码解密相同的文件(除非有散列冲突,但是这不是你可以很容易地发生)。
至于在程序存储你的主密码,这将是更好的将其存储在一个单独的文件中的程序读取,这样你就可以在该文件中使用更严格的操作系统级安全性。
记住mcrypt的请不公钥加密。随着公共密钥加密,你也许可以做你想做的,但。例如,使用PGP / GPG,你可以对文件进行加密,使得三个不同的用户可以使用其私有密钥解密,不知道对方的私钥。所以,你可以拥有与主密码才能解密一切虚拟用户。
另一种选择是,以容纳所有加密数据的两个副本;一个与用户的密码加密,并且加密的一个与所述主密码。
只是为了确定您对此的要求 主密码,
- 它是否预计仅用作 '
encrypt this
' 将“密封”某些东西的命令
那么只有知道相关私钥的人才能打开它吗?或者,- 您是否期望打开企业中完成的任何加密?
- 我只是想确保你的措辞不会被以第二种方式解释
- 你的这句话'
decrypt any data
' 听起来很危险
(并且对于非对称密钥加密来说不可行/不实用)
根据评论更新。
- 您正在计划 数据的两份副本 每个都用不同的密钥加密
- 一份 是要加密的 大众大师 钥匙
- 任何人都可以解密 私人大师 钥匙
然后必须保护主私钥(公钥并不重要)
- 任何人都可以解密 私人大师 钥匙
- 这 第二份 是要加密的
Rijndael 256
钥匙
- 一份 是要加密的 大众大师 钥匙
- 目的是让主机在需要时解密数据
特别是在加密者不在场的情况下
这种方法将使用Rijndael键轻松访问个人的数据,
无需主私钥所有者的干预。
并且,当主私钥所有者信任数据的保密性时。
每次用户更新其副本时,您的方案都需要更新主副本(删除旧副本并重新加密新副本)。
然而,如果 用户数据被master信任 (这里的情况很明显),
- 更简单的方法 是从主人那里发出 Rijndael 钥匙
- 主控可以使用主控公钥本身对其进行加密
- 然后只需使用颁发的 Rijndael 密钥即可对数据进行加密
- 它将始终可以通过主私钥进行访问
可以打开用户的 Rijndael 密钥
- 它将始终可以通过主私钥进行访问
如果用户需要对数据进行签名,可以在此过程中单独完成。
它将使您免于保留双份副本并维护它们。
签署数据, ,用户可以拥有由他们生成的密钥对。
- 在使用 Rijndael 私钥加密数据之前
- 这 主公钥 加密的 用户私钥 可以附加到它
- 这 用户公钥 与主人共享(至少)
足以验证用户已提供数据 - 在最坏的情况下,如果用户不可用且密钥确认失败,
主站可以信任数据的真实性——数据仍然可以被解密