PHPackages                             snowmannunu/mask-cn - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Validation &amp; Sanitization](/categories/validation)
4. /
5. snowmannunu/mask-cn

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

snowmannunu/mask-cn
===================

中文本土场景敏感数据脱敏库 - 内置中国手机号/身份证/银行卡/复姓姓名/车牌等规则,开箱即用,Laravel 友好

v1.2.0(1mo ago)17MITPHPPHP ^7.3 || ^8.0CI passing

Since May 5Pushed 1mo agoCompare

[ Source](https://github.com/SnowmanNunu/mask-cn)[ Packagist](https://packagist.org/packages/snowmannunu/mask-cn)[ Docs](https://github.com/SnowmanNunu/mask-cn)[ RSS](/packages/snowmannunu-mask-cn/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (4)Versions (9)Used By (0)

mask-cn
=======

[](#mask-cn)

> 中文本土场景敏感数据脱敏库 - 开箱即用,无需配置

[![Tests](https://github.com/SnowmanNunu/mask-cn/actions/workflows/tests.yml/badge.svg)](https://github.com/SnowmanNunu/mask-cn/actions)[![Latest Stable Version](https://camo.githubusercontent.com/7e4246cfa99632b27d699ade1989a842b41dee917c973af87fb847b736a99d35/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f736e6f776d616e6e756e752f6d61736b2d636e2e737667)](https://packagist.org/packages/snowmannunu/mask-cn)[![Total Downloads](https://camo.githubusercontent.com/68dcb14efa96750f3d27d1a3e17d4fe1830a9bc26f7b7242058a324142d75da1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f736e6f776d616e6e756e752f6d61736b2d636e2e737667)](https://packagist.org/packages/snowmannunu/mask-cn)[![License](https://camo.githubusercontent.com/bd510718585a8232c16d1050425afd3bf97612e12a20001d8b3e7d96193e26a3/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f736e6f776d616e6e756e752f6d61736b2d636e2e737667)](LICENSE)[![PHP Version](https://camo.githubusercontent.com/23639fc9a867cd3f6cfb1effd172cfaced9357cad7941c1e56dd2698ed6d46c9/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f736e6f776d616e6e756e752f6d61736b2d636e2e737667)](composer.json)

安装
--

[](#安装)

```
composer require snowmannunu/mask-cn
```

要求:PHP 7.3+ / 8.0+ / 8.1+ / 8.2+ / 8.3+,需要 ext-mbstring。

用法
--

[](#用法)

### 基础脱敏

[](#基础脱敏)

```
use MaskCn\Mask;

Mask::phone("13812345678");           // "138****5678"
Mask::idCard("110101199003078888");   // "110101********8888"
Mask::bankCard("6222021234567890123"); // "6222 *********** 0123"
Mask::name("张三");                    // "张*"
Mask::name("欧阳娜娜");                // "欧阳*娜"     ← 复姓识别
Mask::name("诸葛孔明");                // "诸葛*明"     ← 复姓识别
Mask::email("foo@example.com");        // "f**@example.com"
Mask::plate("京A12345");              // "京A***45"
```

### 证件/机构代码脱敏

[](#证件机构代码脱敏)

```
Mask::uscc("91110105MA00XXXXXX");      // "91110105********XX"  ← 统一社会信用代码
Mask::uscc("123456789");               // "123****89"          ← 组织机构代码
Mask::uscc("110101123456789");         // "110101******789"    ← 旧版营业执照

Mask::hkMoPass("H12345678");           // "H****5678"          ← 港澳回乡证
Mask::hkMoPass("81000019900101001X");  // "810000********001X" ← 港澳居住证

Mask::taiwanId("A123456789");          // "A1****789"          ← 台湾身份证
Mask::taiwanId("83000019900101001X");  // "830000********001X" ← 台湾居住证

Mask::passport("E12345678");           // "E****5678"          ← 护照
```

### 地址脱敏

[](#地址脱敏)

```
Mask::address("广东省深圳市南山区科技园");         // "广东省深圳市******"
Mask::address("北京市朝阳区建国路");               // "北京市******"
Mask::address("广西壮族自治区南宁市青秀区民族大道"); // "广西壮族自治区南宁市*******"
```

### 自定义脱敏规则

[](#自定义脱敏规则)

实现 `StrategyInterface` 并注册即可使用:

```
use MaskCn\Mask;
use MaskCn\Strategy\StrategyInterface;

class AsteriskStrategy implements StrategyInterface
{
    public function mask(string $input, array $options = []): string
    {
        $char = isset($options["char"]) ? (string) $options["char"] : "*";
        return str_repeat($char, strlen($input));
    }
}

Mask::register("secret", new AsteriskStrategy());
Mask::secret("password123");           // "***********"
Mask::secret("password123", ["char" => "#"]); // "###########"
```

注册后的策略同样支持 `Mask::array()` 批量脱敏:

```
Mask::array(["token" => "abc123"], ["token" => "secret"]);
// ["token" => "******"]
```

### 数组批量脱敏

[](#数组批量脱敏)

```
$user = [
    "name" => "张小明",
    "phone" => "13812345678",
    "id_card" => "110101199003078888",
];

Mask::array($user, [
    "name" => "name",
    "phone" => "phone",
    "id_card" => "idCard",
]);
// ["name" => "张*明", "phone" => "138****5678", "id_card" => "110101********8888"]
```

### 长文本智能识别(auto 模式)

[](#长文本智能识别auto-模式)

```
$text = "我的电话是 13812345678,身份证是 110101199003078888,邮箱 foo@bar.com";
Mask::auto($text);
// "我的电话是 138****5678,身份证是 110101********8888,邮箱 f**@bar.com"

// 自定义掩码字符
Mask::auto($text, ["char" => "#"]);
// "我的电话是 138####5678,身份证是 110101########8888,邮箱 f##@bar.com"

// 限制识别类型
Mask::auto($text, ["types" => ["phone", "idCard"]]);
// 只脱敏手机号和身份证,邮箱保留原样

// JSON 字符串自动脱敏
$json = '{"user":{"phone":"13812345678","idCard":"110101199003078888"},"email":"foo@bar.com"}';
Mask::auto($json);
// '{"user":{"phone":"138****5678","idCard":"110101********8888"},"email":"f**@bar.com"}'
```

Auto 内置识别类型:

类型示例说明`idCard``110101199003078888`18位身份证`phone``13812345678`大陆手机号`email``foo@bar.com`邮箱`plate``京A12345`中国车牌(含新能源)`taiwanId``A123456789`台湾身份证/居住证`hkMoPass``H12345678`港澳回乡证`passport``E12345678`护照`uscc``91110105MA00XXXXXX`统一社会信用代码(18位)`bankCard``6222021234567890123`银行卡(16-19位)### 全局配置

[](#全局配置)

通过 `Config` 类可统一设置默认掩码字符,无需在每个调用处重复传入:

```
use MaskCn\Config;
use MaskCn\Mask;

Config::set(['char' => '#']);

Mask::phone('13812345678');        // "138####5678"
Mask::idCard('110101199003078888'); // "110101########8888"
Mask::auto('电话 13812345678');     // "电话 138####5678"
```

优先级: 方法级 `options['char']` &gt; `Config::get('char')` &gt; 默认 `*`。

```
Config::set(['char' => '#']);
Mask::phone('13812345678', ['char' => '*']); // "138****5678" ← options 优先
```

```
Config::reset(); // 清空配置
```

### PSR-3 Logger 集成

[](#psr-3-logger-集成)

自动在日志输出前脱敏敏感字段,无需改动业务代码:

```
use MaskCn\Logger\MaskSensitiveLogger;
use Psr\Log\LoggerInterface;

$maskLogger = new MaskSensitiveLogger($originalLogger);
$maskLogger->info('用户 phone: 13812345678, 身份证: 110101199003078888');
// 实际记录: "用户 phone: 138****5678, 身份证: 110101********8888"
```

也可在任意日志框架中使用静态处理器:

```
use MaskCn\Logger\MaskProcessor;

$message = MaskProcessor::process('用户 phone: 13812345678');
// "用户 phone: 138****5678"
```

### 自定义掩码字符

[](#自定义掩码字符)

所有方法均支持 `char` 选项:

```
Mask::phone("13812345678", ["char" => "#"]);     // "138####5678"
Mask::idCard("110101199003078888", ["char" => "#"]); // "110101########8888"
```

### Laravel 集成

[](#laravel-集成)

服务提供者已通过 `extra.laravel.providers` 自动注册,无需手动配置。

```
use MaskCn\Laravel\Facades\Mask;

Mask::phone($user->phone);
Mask::register("secret", new AsteriskStrategy());
```

也可作为验证规则使用(可选):

```
use MaskCn\Laravel\Rules\MaskedField;

$request->validate([
    "phone_masked" => ["string", new MaskedField("phone")],
    "plate_masked" => ["string", new MaskedField("plate")],
    "passport_masked" => ["string", new MaskedField("passport")],
]);
```

支持的验证类型: `phone`、`idCard`、`email`、`bankCard`、`name`、`plate`、`uscc`、`hkMoPass`、`taiwanId`、`passport`、`address`。

测试
--

[](#测试)

```
composer test
composer stan      # 静态分析
composer fix       # 代码风格
```

路线图
---

[](#路线图)

- v0.1.x: 基础 6 个 Strategy + Auto 智能识别 + Laravel 集成
- v0.2.x: 统一社会信用代码、组织机构代码、旧版营业执照
- v0.2.x: 港澳通行证/居住证、台湾身份证/居住证、护照
- v0.2.x: 中文地址脱敏
- v0.2.x: Auto 模式支持 char 选项和 JSON 输入
- v0.3.x: 自定义脱敏规则注册
- v1.0.0: 全局配置(Config) + PSR-3 Logger 集成
- v1.1.0: MaskedField 验证规则扩展 + Auto 模式新增证件/车牌/USCC 识别
- v1.2.0: Config 支持按策略配置保留位数 + MaskedField 支持自定义掩码字符校验

License
-------

[](#license)

MIT

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance93

Actively maintained with recent releases

Popularity8

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity44

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

8

Last Release

33d ago

Major Versions

v0.3.1 → v1.0.02026-05-06

PHP version history (2 changes)v0.1.0PHP ^7.4 || ^8.0

v0.2.0PHP ^7.3 || ^8.0

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/32590260?v=4)[SnowmanNunu](/maintainers/SnowmanNunu)[@SnowmanNunu](https://github.com/SnowmanNunu)

---

Top Contributors

[![SnowmanNunu](https://avatars.githubusercontent.com/u/32590260?v=4)](https://github.com/SnowmanNunu "SnowmanNunu (15 commits)")

---

Tags

bank-carddata-maskingid-cardlaravelphone-maskphpsensitive-datalaravelmaskdata-maskingChina

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/snowmannunu-mask-cn/health.svg)

```
[![Health](https://phpackages.com/badges/snowmannunu-mask-cn/health.svg)](https://phpackages.com/packages/snowmannunu-mask-cn)
```

###  Alternatives

[laravel/framework

The Laravel Framework.

34.7k532.1M19.2k](/packages/laravel-framework)[matomo/matomo

Matomo is the leading Free/Libre open analytics platform

21.6k38.2k](/packages/matomo-matomo)[aporat/store-receipt-validator

PHP receipt validator for Apple App Store and Amazon Appstore

6503.9M11](/packages/aporat-store-receipt-validator)[tempest/framework

The PHP framework that gets out of your way.

2.2k31.1k11](/packages/tempest-framework)[api-platform/metadata

API Resource-oriented metadata attributes and factories

244.5M180](/packages/api-platform-metadata)[dialect/laravel-gdpr-compliance

GDPR compliant data portability and anonymization

57119.1k](/packages/dialect-laravel-gdpr-compliance)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
