globyapp / hash-sensitive
Monolog处理器,通过哈希值来保护敏感信息不被记录
Requires
- php: >=8.1
- monolog/monolog: ^3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.16
- pestphp/pest: ^2.4
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- vimeo/psalm: ^5.23
README
Monolog处理器,通过哈希值来保护敏感信息不被记录。
摘要
关于
一个Monolog处理器,用于保护敏感数据免遭错误记录。由redact-sensitive(由Leo Cavalcante创建)分支而来。在从日志中编辑值时,能够比较相等的编辑值可能很有用。
通过将值替换为其值的哈希版本来避免记录类似{"api_key":"mysupersecretapikey"}
的内容
Readme.INFO: Hello, World! {"api_key":"3f6b5eb5b4bc422fc119c76caccd8792d1cf253a71a04d520206a01f1463ca41"} []
特性
- 为预定义的数组键添加Monolog处理器
- 在Monolog上下文中哈希敏感数据,以防止将机密信息发送到日志中。
- 哈希版本是确定的,因此允许在错误之间进行关联。
需求
- PHP >= 8.1.0
- Composer
- Monolog >= 3.0
安装
将包添加到您的依赖项
composer require globyapp/hash-sensitive
使用方法
1. 准备您的敏感键
它是一个键名数组,例如
$sensitive_keys = ['api_key'];
将哈希api_key
的值。
2. 使用键创建处理器
现在可以使用给定的键创建新的处理器
use GlobyApp\HashSensitive\HashSensitiveProcessor; $sensitive_keys = ['api_key']; $processor = new HashSensitiveProcessor($sensitive_keys);
3. 将处理器设置到Monolog\Logger
use GlobyApp\HashSensitive\HashSensitiveProcessor; $sensitive_keys = ['api_key']; $processor = new HashSensitiveProcessor($sensitive_keys); $logger = new \Monolog\Logger('Readme'); $logger->pushProcessor($processor);
示例
use Monolog\Handler\StreamHandler; use GlobyApp\HashSensitive\HashSensitiveProcessor; $sensitive_keys = ['api_key']; $processor = new HashSensitiveProcessor($sensitive_keys); $logger = new \Monolog\Logger('Readme', [new StreamHandler(STDOUT)]); $logger->pushProcessor($processor); $logger->info('Hello, World!', ['api_key' => 'mysupersecretapikey']);
Readme.INFO: Hello, World! {"api_key":"3f6b5eb5b4bc422fc119c76caccd8792d1cf253a71a04d520206a01f1463ca41"} []
独立使用库
可以在不将其作为monolog钩子使用的情况下使用库中的逻辑。这可以通过构造一个新的Hasher
类实例来实现。函数scrubKeys
,可以用相同的方式指定要清除的值数组和敏感键数组,就像使用monolog库一样。
我不想输出被哈希,只想用预定义的字符串替换
如果您想使用用户定义的字符串格式化输出,这不是正确的项目。您可能想看看redact-sensitive。
API
长度限制 & 算法
使用lengthLimit
截断编辑的敏感信息,例如长令牌。截断总是在哈希之前发生。使用algorithm
指定用于哈希值的算法。有关支持算法的列表,请参阅PHP文档。
use Monolog\Handler\StreamHandler; use GlobyApp\HashSensitive\HashSensitiveProcessor; $sensitive_keys = ['access_token']; $processor = new HashSensitiveProcessor($sensitive_keys, algorithm: 'sha256', lengthLimit: 5); $logger = new \Monolog\Logger('Example', [new StreamHandler(STDOUT)]); $logger->pushProcessor($processor); $logger->info('Truncated secret', ['access_token' => 'Very long JWT ...']); $logger->info('Truncated secret', ['access_token' => 'Very long token ...']);
Example.INFO: Truncated secret {"access_token":"22e25a68c0ef48364f3f12a0ebbb550e595e15aaec09a96ca3eea7d78daa2b72"} []
Example.INFO: Truncated secret {"access_token":"22e25a68c0ef48364f3f12a0ebbb550e595e15aaec09a96ca3eea7d78daa2b72"} []
嵌套值
它应该也可以处理嵌套对象和数组。为了更精细地控制如何处理嵌套值,可以设置exclusiveSubtree
布尔值。当设置为true时,这会导致算法在存在指定的敏感键子树的情况下,仅检查值的子树与敏感键的该子树中的键。这是默认行为。当设置为false时,将检查输入数据中的每个键与敏感键中的每个键。
use Monolog\Handler\StreamHandler; use GlobyApp\HashSensitive\HashSensitiveProcessor; $sensitive_keys = [ 'test', 'test_subkey' => [ 'to_hash', ], ]; $processor = new HashSensitiveProcessor($sensitive_keys); $logger = new \Monolog\Logger('Example', [new StreamHandler(STDOUT)]); $logger->pushProcessor($processor); $logger->info('Nested', [ 'test_key' => 'test_value', 'test_subkey' => [ 'to_hash' => 'test_value', 'test' => 'test', ], ]);
exclusiveSubtree = true:
(test
未哈希,因为test_subkey
在$sensitive_keys
中指定了一个子键配置,其中只有to_hash
被哈希)。
Example.INFO: Nested {"test_key":"test_value","test_subkey":{"to_hash":"4f7f6a4ae46676d9751fdccdf15ae1e6a200ed0de5653e06390148928c642006","test":"test"}} []
exclusiveSubtree = false:
(test
被哈希,因为test
是$sensitive_keys
中的键)。
Example.INFO: Nested {"test_key":"test_value","test_subkey":{"to_hash":"4f7f6a4ae46676d9751fdccdf15ae1e6a200ed0de5653e06390148928c642006","test":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"}} []
已知问题
目前,没有已知问题。
感谢
请随意提出任何问题或PR。
MIT © 2024