archwisp/php-crypt

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

1.1.0 2016-03-14 17:36 UTC

This package is not auto-updated.

Last update: 2024-09-24 06:31:38 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:负责真正清理项目