archwisp / php-encrypt-data

适用于PHP 5.3+的简单数据加密库

1.1.0 2016-03-14 17:36 UTC

This package is not auto-updated.

Last update: 2024-09-24 07:17:04 UTC


README

Build Status Coverage Status

如果您正在寻找“如何在PHP中加密敏感数据?”这个问题的答案,那么您来到了正确的位置。阅读这份README,执行几个命令,编写四行代码,您就可以拥有安全的加密了。

安装

通过Composer安装

  1. 使用您喜欢的途径下载Composer

  2. 将PHPEncryptData添加到您的项目中

     $ php composer.phar require archwisp/php-encrypt-data
    

基本用法

  1. 生成您的加密密钥

     $ head -c 32 /dev/urandom | base64
     6zp4y5vnUQpfEroWI6dMq5lC46F5Dmqa4NDcM1W42k=
    
  2. 生成您的MAC密钥

     $ head -c 32 /dev/urandom | base64
     RJikKksPg3UmqgQPXBwCmcSOMHQn0iOtQAFcfcQOTU=
    
  3. 编写您的代码

     <?php
    
     require __DIR__ . '/vendor/autoload.php';
    
     // These keys won't actually work... on purpose. Create your OWN!
     $encryptionKey = '6zp4y5vnUQpfEroWI6dMq5lC46F5Dmqa4NDcM1W42k=';
     $macKey = 'RJikKksPg3UmqgQPXBwCmcSOMHQn0iOtQAFcfcQOTU=';
     
     $phpcrypt = new \PHPEncryptData\Simple($encryptionKey, $macKey);
    
     $ciphertext = $phpcrypt->encrypt('Foobar');
     printf("Ciphertext: %s\n", $ciphertext);
    
     $decrypted = $phpcrypt->decrypt($ciphertext);
     printf("Decrypted: %s\n", $decrypted);
    

这个库是如何产生的

一位我知道的本地PHP用户组的程序员/朋友被要求在一个应用程序中加密一些数据,并开始搜索Google以寻找一个好的解决方案。在找到一些有希望的结果后,她将找到的东西发给我,希望我能审阅,因为她知道我对密码学有深厚的兴趣和一定的背景。在审查代码时,我发现了一些关键问题。在我写回复并解释需要实施的修复时,我意识到这不是一个没有一些密码分析经验的人能够正确实施的事情。

因此,我开始创建这个库,在这个库中,我已经为您做出了所有的艰难决定。虽然其他地方有更好的构造,但它们带来了一些更难处理的负担,所以它们并不真正适合“简单”库。在这个库的当前设计中,您必须执行几个命令来生成几个密钥,这些密钥将固定在您的代码中。然后,您只需要在需要时调用encrypt()和decrypt()函数。

我使用这个库的目标是提高PHP中加密的基线。

召唤智能密码学专家

您愿意提供的任何审阅和反馈都将受到赞赏。如果您发现一个重大的错误、效率改进或可以具体改进的设计决策,请提交问题。src/Simple.php是所有事情发生的地方,tests/SimpleTest.php包含单元测试。

谢谢!

密码学细节

对于大多数密码学功能,这个库使用了Mcrypt扩展。这个扩展已经存在十多年了,但许多发行版都没有默认包含它。您需要确保您已经安装了它。

这个库背后的密码学原语和实践包括

  • 192位Rijndael块密码(256位密钥和192位块大小;不兼容AES)
  • CFB块密码模式
  • HMAC-SHA-256/128(输出的前128位)
  • 加密后MAC构造
  • 常时间MAC比较
  • 使用/dev/urandom作为其PRNG

示例(解释)

这个库的目标是提供安全默认值和简单性。加密和解密数据有五个简单的步骤要遵循(参见Example.php脚本来查看所有内容)

  1. 找到一个运行超过15分钟的Linux机器,并使用以下命令生成加密密钥

     head -c 32 /dev/urandom | base64
    

    输出将类似于以下内容(不要使用这个示例密钥!……它无论如何都不能工作)

     6zp4y5vnUQpfEroWI6dMq5lC46F5Dmqa4NDM1W42k=
    
  2. 再次运行该命令以生成您的MAC密钥

     head -c 32 /dev/urandom | base64
    

    同样,输出将类似于以下内容(请确保它与加密密钥不同)。

     RJikKksPg3UmqgQPXBwCmcSOMHQn0iOtQAFccQOTU=
    
  3. 根据上述输入,将以下代码添加到您的bootstrap中

     <?php
    
     require __DIR__ . '/vendor/autoload.php';
    
     $encryptionKey = '6zp4y5vnUQpfEroWI6dMq5lC46F5Dmqa4NDcM1W42k=';
     $macKey = 'RJikKksPg3UmqgQPXBwCmcSOMHQn0iOtQAFcfcQOTU=';
     
     $phpcrypt = new \PHPEncryptData\Simple($encryptionKey, $macKey);
    
  4. 调用encrypt()函数

     $ciphertext = $phpcrypt->encrypt('Foobar');
    

    这将生成类似以下输出

     MHxjcUhrSnR5cUlnc2RLbmxGRkJFRUtZMmUyQkdvM01pVnlaRk5XM2VjfEJyc0FFaEhUZGs1T3A4VElFUFJLUXc9PQ==
    

    如您所见,输出已经为您进行base64编码,并且MAC已经自动附加,因此您无需担心任何加密细节。甚至构建过程也编码到这个字符串中,以适应未来的更改。只需输入明文,即可输出编码和签名的密文。

    此外,请注意,每个加密的IV都是随机生成的,因此加密相同的值将产生不同的密文。如果您需要手动控制它,encrypt()函数接受一个IV作为可选的第二个参数。大多数人不应使用它。

  5. 调用decrypt()函数

     $ciphertext = $phpcrypt->decrypt(
         'MHxjcUhrSnR5cUlnc2RLbmxGRkJFRUtZMmUyQkdvM01pVnlaRk5XM2VjfEJyc0FFaEhUZGs1T3A4VElFUFJLUXc9PQ=='
     );
    

    这将产生以下值

     'Foobar'
    

单元测试

  1. 使用您喜欢的途径下载Composer

  2. 从PHPEncryptData目录中,安装项目依赖项

     $ php composer.phar install
    
  3. (可选)如果您想自定义PHPUnit配置

     $ cp phpunit.xml.dist phpunit.xml
    

    然后根据您的喜好自定义phpunit.xml。

  4. 从项目根目录执行phpunit二进制文件

     $ ./vendor/bin/phpunit
    

鸣谢

  • Bryan C. Geraghty:原始作者
  • John Kary:负责真正清理该项目