globyapp/hash-sensitive

Monolog处理器,通过哈希值来保护敏感信息不被记录

v1.0.0 2024-04-25 23:45 UTC

This package is auto-updated.

Last update: 2024-09-05 14:08:53 UTC


README

Monolog处理器,通过哈希值来保护敏感信息不被记录。

Packagist Version Packagist PHP from Packagist CI

摘要

关于

一个Monolog处理器,用于保护敏感数据免遭错误记录。由redact-sensitive(由Leo Cavalcante创建)分支而来。在从日志中编辑值时,能够比较相等的编辑值可能很有用。

通过将值替换为其值的哈希版本来避免记录类似{"api_key":"mysupersecretapikey"}的内容

Readme.INFO: Hello, World! {"api_key":"3f6b5eb5b4bc422fc119c76caccd8792d1cf253a71a04d520206a01f1463ca41"} []

特性

  • 为预定义的数组键添加Monolog处理器
  • 在Monolog上下文中哈希敏感数据,以防止将机密信息发送到日志中。
  • 哈希版本是确定的,因此允许在错误之间进行关联。

需求

安装

将包添加到您的依赖项

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