公钥加密实现

时间:2009-08-04 04:23:58

标签: php encryption public-key mcrypt

我一直在使用PHP mcrypt模块加密我公司的敏感数据。这一直运作良好。但是,我被要求创建一个新的主密码,该密码应该能够解密任何数据。问题是这个主密码必须在脚本文件中进行硬编码。如果我错了,请纠正我,但唯一安全的方法似乎是在脚本中对公钥进行硬编码并使用它来加密数据,同时保持私钥的安全,并仅在需要时使用它进行解密。

mcrypt似乎没有这种方案的实现。有没有人知道这样做的库(PHP模块或纯PHP)?

4 个答案:

答案 0 :(得分:2)

有一个PECL扩展。 http://us2.php.net/manual/en/book.gnupg.php

你也可以使用php中的gnupg命令行工具,如果它不是非常快:http://devzone.zend.com/article/1265

我没有尝试过任何一种方法。

答案 1 :(得分:2)

我建议看一下PHP OpenSSL绑定,特别是openssl_public_encrypt()函数。您确实可以将主公钥嵌入到脚本中,并让脚本使用此公钥加密每个用户的AES密钥。保持公司中相应的主私钥安全。

如果您需要主解密功能,您可以提取加密的用户密钥,使用主私钥解密,然后解密原始数据。

答案 2 :(得分:1)

只是为了确定您对主密码的要求,

  1. 是否只能将其用作“ encrypt this ”命令,以“密封”某些内容 哪个只能由知道私钥的人打开?要么,
    • 您希望在企业中打开任何加密功能吗?
    • 我只是想确保你的措辞不能以第二种方式解释
    • 您的短语“ decrypt any data ”听起来很危险 (非对称密钥加密不可行/不实用)

  2. 根据评论进行更新。

    • 您计划使用不同的密钥加密两份数据
      • 一个副本将使用 master public 键进行加密
        • 可以与拥有主私人键的任何人解密 然后必须保护主私钥(公钥不重要)
      • 第二份副本将使用Rijndael 256密钥
      • 进行加密
    • 目的是允许主设备在需要时解密数据 特别是,没有加密的个人

    这种方法适用于, 个人使用Rijndael键轻松访问数据,
    无需主私钥所有者的干预。
    并且,当主私钥所有者受信任时保密数据。

    每次用户更新副本时,您的方案都需要更新主副本(删除旧副本并重新加密新副本)。


    但是,如果用户数据受主人信任(这里显然是这样),

    • 更简单的方法将从主人发出Rijndael密钥
    • 主人可以使用主公钥本身加密
    • 然后可以使用已发布的Rijndael密钥对数据进行加密
      • 始终可以使用主私钥来访问 这可以打开用户的Rijndael密钥

    如果用户需要签署数据,可以在此过程中单独完成 它将使您免于保留双重副本并进行维护。


    要对数据进行签名,用户可以拥有由他们生成的密钥对。

    • 使用Rijndael私钥加密数据之前
    • 使用用户私钥加密的主公钥可以附加到其中
    • 与主人共享的用户 - 公钥(至少)
      将足以验证用户是否提供了数据
    • 在最坏的情况下,如果用户不可用且密钥确认失败,则 主人可能会信任数据的真实性 - 这仍然可以被解密

答案 3 :(得分:1)

我看不出那是怎么回事。任何双向加密函数只有在输入用于加密的特定密码时才会解密(除非您是NSA并且在算法中放回了门)。你不能让两个密码解密同一个文件(除非有哈希冲突,但这不是你可以轻易做到的事情)。

至于将主密码存储在程序中,最好将其存储在程序读入的单独文件中,这样您就可以在该文件上使用更严格的操作系统级安全性。

请记住,mcrypt不是公钥加密。但是,使用公钥加密技术,您可能可以执行所需的操作。例如,使用PGP / GPG,您可以加密文件,以便三个不同的用户可以使用其私钥解密它,而无需了解彼此的私钥。因此,您可以让虚拟用户拥有可以解密所有内容的主密码。

另一种选择是保存所有加密数据的两份副本;一个用用户密码加密,一个用主密码加密。