netglue/zf2-encryption-module

该软件包已被废弃,不再维护。未建议替代软件包。

一个ZF2模块,提供使用Zend的RSA加密库和密钥管理的辅助工具

dev-master 2014-04-17 14:05 UTC

This package is auto-updated.

Last update: 2020-03-30 12:52:50 UTC


README

简介

ZF2的RSA密钥工具非常易于使用,真正出色!本模块旨在解决您有非技术用户需要能够解密存储在应用程序中的敏感信息,同时仍保持一定程度的安全性和隐私的问题。

预期各种路由/控制器将由某种其他类型的身份验证模块(如ZfcUserZfcRbacZfcAcl等)保护。此模块不会尝试阻止对密钥对管理工具的未经授权访问。

安全问题

我不是安全或加密专家。对我来说,在服务器上一起存储私有密钥和公钥不是什么好主意。可能更好的解决方案是只存储公钥,让用户粘贴私钥,并在需要解密时将其存储在会话中,但出于我的需求,对于用户来说,只需输入密码即可启用解密要简单得多,因此我永远不会提倡不使用密码短语来加密私钥。至少这样,如果您的数据库充满了加密数据并且私钥被泄露,密码包含最后一道防线...

此外,由于会话容器没有特殊配置,因此可能明智地设置默认会话管理器的一些合理值,例如限制会话容器的生命周期等。

安装

应使用composer安装该模块。其名称为netglue/zf2-encryption-module。如果您在安装时遇到问题,请检查您的minimum-stability设置。

在您的主配置文件中启用该模块。应输入的模块名称是NetglueEncrypt

安装后,在vendor/netglue/zf2-encryption-module目录中查看配置文件,以了解您可以为您的应用程序更改哪些内容。

贡献等

非常愿意接受对改进模块的贡献。代码托管在github.com/netglue/zf2-encryption-module

视图脚本

所有视图脚本都使用['view_manager']['template_map']键映射,模板名称以netglue-encrypt开头,因此应很容易用您自己的视图脚本覆盖它们

路由

如果您查看module-name/config/routes.config.php,您会发现可以轻松覆盖URL位置。

密钥对存储

这是该模块的主要功能,该模块提供了一个接口,用于抽象密钥存储概念。目前只有文件系统密钥存储,但理论上是您可以在不费太多周折的情况下,插入实现 NetglueEncrypt\KeyStorage\KeyStorageInterface 的不同类。

配置的默认密钥存储实例可以通过服务管理器使用密钥访问。

$serviceLocator->get('NetglueEncrypt\KeyStorage');

会话密码存储

您可以从服务定位器获取存储密码的会话容器。

$serviceLocator->get('NetglueEncrypt\Session');

该容器有一些非常简单的方法,用于获取/设置密码以及检查是否已设置密码。

为了与其他模块进行互操作,我认为最好不用会话管理器对会话进行任何特殊设置 - 我认为这不是确定会话行为的地方,因为这通常是在应用程序层面上完成的。因此,容器只是用 new Container('netglue_encrypt') 实例化,这意味着您也可以使用此名称从默认会话管理器中检索它。

控制器插件

控制器插件将在会话中未设置密码且需要密码的地方抛出异常。

// Use 'Default' Key Pair
$encrypted = $this->ngCrypt()->encrypt('Some Text');
$plain = $this->ngCrypt()->decrypt($encrypted);

// Set Key Pair to use with it's name
$this->ngCrypt()->setKeyName('Some Other Key Pair');

// Check it's possible to use the plugin with the current selected key pair
$plugin = $this->ngCrypt();
if($plugin->isReady()) {
	$out = $plugin->encrypt('Foo');
	var_dump($out);
}

视图助手

视图助手主要旨在在会话中设置了适当的密码时自动解密视图中的数据。在其他所有情况下,视图助手应返回类似于 <span class="encrypted">加密的</span> 的字符串。

操作与控制器插件非常相似。

// Assuming the controller has provided $this->encryptedData to the view model
// and we're using the default key pair

// You should expect no exceptions to be thrown when decrypting data
echo $this->ngCrypt($this->encryptedData); // Either the decrypted string or the placeholder such as 'Encrypted'

// Using a different key pair
echo $this->ngCrypt()->setKeyName('Some Key')->decrypt($this->encryptedData);
// or
$this->ngCrypt()->setKeyName('Some Key');
echo $this->ngCrypt($this->encryptedData);

// Change the placeholder text returned when decryption is not possible
$this->ngCrypt()->setPlaceholder('<strong>No Workie</strong>');

过滤器

有2个过滤器可供使用,并且可以从服务管理器获取实例。

$encryptFilter = $serviceLocator->get('NetlgueEncrypt\Filter\Encrypt');
$decryptFilter = $serviceLocator->get('NetlgueEncrypt\Filter\Decrypt');

它们的行为符合预期 - 我不确定是否从服务管理器检索它们是否是好的实践。我愿意考虑其他方案!

我没有将它们创建为标准 Zend\Filter\Encrypt 过滤器的适配器,因为 setAdapter() 方法不接受实例,只接受类名,因此无法将依赖注入到过滤器中。

待办事项

  • 下载密钥
  • 导入密钥
  • 向控制器插件和视图助手添加签名和验证方法
  • 向视图添加签名和验证功能/表单
  • 在整个异常处理中清理,以在try块中捕获正确的异常类
  • 测试
  • 视图中的内联文档
  • 更多密钥存储设备,如数据库?Mongo?

更多想法

  • 了解密钥对有多久的历史可能很有用,这可以在密钥存储接口中轻松实现。
  • 提供易于签密电子邮件消息的功能
  • 也许允许公开暴露和下载公钥,以便第三方可以加密数据或验证签名等。