{"id":20482916,"url":"https://github.com/lzhpo/crypto-spring-boot-starter","last_synced_at":"2025-04-13T14:33:35.672Z","repository":{"id":206052829,"uuid":"714551681","full_name":"lzhpo/crypto-spring-boot-starter","owner":"lzhpo","description":"一款API字段加密解密插件，支持多种加密解密策略（BASE64、AES、DES、RSA、国密SM4...），支持自定义加密解密策略，支持多层嵌套属性加密解密，支持在Controller上使用注解跳过加密解密...","archived":false,"fork":false,"pushed_at":"2024-11-29T16:21:55.000Z","size":446,"stargazers_count":14,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-27T05:33:31.660Z","etag":null,"topics":["crypto","decrypt","encrypt","spring","spring-boot"],"latest_commit_sha":null,"homepage":"http://www.lzhpo.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lzhpo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-11-05T07:28:08.000Z","updated_at":"2024-12-25T08:01:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"98bdcddd-4219-46f1-83a9-9053d6bc14af","html_url":"https://github.com/lzhpo/crypto-spring-boot-starter","commit_stats":null,"previous_names":["lzhpo/crypto-spring-boot-starter"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lzhpo%2Fcrypto-spring-boot-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lzhpo%2Fcrypto-spring-boot-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lzhpo%2Fcrypto-spring-boot-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lzhpo%2Fcrypto-spring-boot-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lzhpo","download_url":"https://codeload.github.com/lzhpo/crypto-spring-boot-starter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248728482,"owners_count":21152228,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crypto","decrypt","encrypt","spring","spring-boot"],"created_at":"2024-11-15T16:15:10.208Z","updated_at":"2025-04-13T14:33:35.666Z","avatar_url":"https://github.com/lzhpo.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](https://img.shields.io/badge/JDK-1.8+-success.svg)\n![](https://maven-badges.herokuapp.com/maven-central/com.lzhpo/crypto-spring-boot-starter/badge.svg?color=blueviolet)\n![](https://img.shields.io/:license-Apache2-orange.svg)\n[![Style check](https://github.com/lzhpo/crypto-spring-boot-starter/actions/workflows/style-check.yml/badge.svg)](https://github.com/lzhpo/crypto-spring-boot-starter/actions/workflows/style-check.yml)\n\n## 开源地址\n\n- GitHub：[https://github.com/lzhpo/crypto-spring-boot-starter](https://github.com/lzhpo/crypto-spring-boot-starter)\n- Gitee：[https://gitee.com/lzhpo/crypto-spring-boot-starter](https://gitee.com/lzhpo/crypto-spring-boot-starter)\n\n## 如何使用？\n\n*crypto-spring-boot-starter也支持SpringBoot3*\n\n\u003e 3.0.0及以上版本的crypto-spring-boot-starter只针对使用SpringBoot3用户，SpringBoot2用户请使用低于3.0.0版本的crypto-spring-boot-starter，两者功能不受影响，均会同步更新！\n\n### 1.导入依赖\n\n\u003e 依赖已发布至Maven中央仓库，可直接引入依赖。\n\n- Maven：\n  ```xml\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.lzhpo\u003c/groupId\u003e\n    \u003cartifactId\u003ecrypto-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e${latest-version}\u003c/version\u003e\n  \u003c/dependency\u003e\n  ```\n- Gradle:\n  ```groovy\n  implementation 'com.lzhpo:crypto-spring-boot-starter:${latest-version}'\n  ```\n\n### 2.实体类字段上使用 `@Encrypt` 或 `@Decrypt` 注解配置加密解密策略\n\n1. 支持多种加密解密策略，例如：BASE64、AES、DES、RSA、国密SM4...\u003cbr\u003e\n    ```java\n    @Encrypt(strategy = CryptoStrategy.BASE64)\n    private String name1;\n\n    @Decrypt(strategy = CryptoStrategy.BASE64)\n    private String name2;\n\n    @Encrypt(strategy = CryptoStrategy.SM4, arguments = \"${custom.sm4.key}\")\n    private String name3;\n\n    @Decrypt(strategy = CryptoStrategy.SM4, arguments = \"${custom.sm.key:1234567812345678}\")\n    private String name4;\n\n    @Encrypt(strategy = CryptoStrategy.AES)\n    private String address1;\n\n    @Decrypt(strategy = CryptoStrategy.AES)\n    private String address2;\n\n    @Encrypt(strategy = CryptoStrategy.DES)\n    private String address3;\n\n    @Decrypt(strategy = CryptoStrategy.DES)\n    private String address4;\n\n    @Encrypt(strategy = CryptoStrategy.RSA)\n    private String mobilePhone1;\n\n    @Decrypt(strategy = CryptoStrategy.RSA)\n    private String mobilePhone2;\n\n    @Encrypt(strategy = CryptoStrategy.SM4)\n    private String mobilePhone3;\n\n    @Decrypt(strategy = CryptoStrategy.SM4)\n    private String mobilePhone4;\n\n    @EncryptHandler(FaceCustomizeEncryptHandler.class)\n    @Encrypt(strategy = CryptoStrategy.CUSTOMIZE_HANDLER)\n    private String description1;\n\n    @DecryptHandler(FaceCustomizeDecryptHandler.class)\n    @Decrypt(strategy = CryptoStrategy.CUSTOMIZE_HANDLER)\n    private String description2;\n    ```\n2. 支持自定义加密解密策略。实现 `CustomizeCryptoHandler` 接口（加密解密都是此接口），使用 `@EncryptHandler` 或 `@DecryptHandler` 注解指向实现的策略即可。\n    ```java\n    @EncryptHandler(FaceCustomizeEncryptHandler.class)\n    @Encrypt(strategy = CryptoStrategy.CUSTOMIZE_HANDLER)\n    private String description1;\n\n    @DecryptHandler(FaceCustomizeDecryptHandler.class)\n    @Decrypt(strategy = CryptoStrategy.CUSTOMIZE_HANDLER)\n    private String description2;\n    ```\n3. `@Encrypt` 或 `@Decrypt` 注解中的 `arguments` 支持从环境变量中读取以及设置默认值，同时也方便了自定义加密解密策略的时候灵活配置。\n    ```java\n    @Encrypt(strategy = CryptoStrategy.AES, arguments = {\"${crypto.aes.key}\"})\n    private String address1;\n\n    @Decrypt(strategy = CryptoStrategy.AES, arguments = {\"${crypto.aes.key:1234567890123456}\"})\n    private String address2;\n    ```\n   同时，参数支持在 IDEA 中自动高亮显示。\n   ![](docs/images/SpEL-IDEA.png)\n4. 支持在配置文件中单独对加解密策略设置不同的参数以及回退策略，需要注意的是 `@Encrypt` 和 `@Decrypt` 注解中配置的 `arguments` 优先级大于此处的配置。\n    ```yml\n    crypto:\n      default-fallback-value: \"N/A\"\n      strategy:\n        aes:\n          fallback-value: empty_string\n          arguments:\n            # The arguments[0] is AES key\n            - \"1234567812345678\"\n        des:\n          fallback-value: null_value\n          arguments:\n            # The arguments[0] is DES key\n            - \"12345678\"\n        sm4:\n          fallback-value: original_value\n          arguments:\n            # The arguments[0] is SM4 key\n            - \"1234567812345678\"\n        rsa:\n          fallback-value: empty_string\n          arguments:\n            # The arguments[0] is RSA private key\n            - \"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANyhI/9e5evQyzRLVsUmbQesdRl7fXu9ZAl6lZqVyL+ypf6FmQouH89OTEv/JjmybuAha9zsYwNAKSobSRATaqYSCvdwoPRgUFRFfq6ed61kpO5+D+T/X3v85JmXIngkieCe9n5b5KT3XNtHFBXVsZ3/onWEYZRhFMTsMsKkvijBAgMBAAECgYAKV2fEbC5vAp0JvRfKuym8ZLgi6wPHWWnfW154jdmIab9n2huBq4aMbSU8oS+pn+xcR1jC1NYxxG/BhGCk9yIGIzE/57tggjibNpiqC/uS12SiaJPz9oqOVJPI+l5uf9xqdytzvNJe6AGMViZdS+nnQRZfdDrs5cgghv7lx+kjiQJBAOQWmEJukHaIUXvW8ZWNekIgb8/Frq7gNvRaeqjqpZMqUIXXDj80eODGsNjIUwwEdlFX4//C7udmLfWfhyOq1bkCQQD3oOGP8rjIkouhbJldaILeuaN3ee3v3dtsmLM8epC9HH3EcFBD2O+l60wCa67uM/ArPn3XjL/lidqnVAJHPG9JAkEAumz1WicAkMFuyGew4enXKcFVYl9THcBJaoOhifrwBk8prZtPG74Jpr7/wNBLgKENDANoaZ2soxnTKtWPIUn6kQJAAmcxSTBV0rx5VmuzYVCuVHMAvxwTzwwcIQWqV5/o36zzG4Drhn0Idle+ORfKbs1aO1Ez72+SPSwFTzJlg0N24QJATQu2dlhbm87uGh0fUHpV6Nw6lf/mBMek1stC8PQXB0MtNPeYd+Ul45zfc+k5mIWUHwt47To5uAo2ywsCSdWBCw==\"\n            # The arguments[1] RSA public key\n            - \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcoSP/XuXr0Ms0S1bFJm0HrHUZe317vWQJepWalci/sqX+hZkKLh/PTkxL/yY5sm7gIWvc7GMDQCkqG0kQE2qmEgr3cKD0YFBURX6unnetZKTufg/k/197/OSZlyJ4JIngnvZ+W+Sk91zbRxQV1bGd/6J1hGGUYRTE7DLCpL4owQIDAQAB\"\n    ```\n   配置参数解释：\n   - `fallback-value`：当加解密出现异常的时候需要做的事情。\n     - original_value：返回原始值。\n     - null_value：返回 null 值。\n     - empty_string：返回空字符串。\n     - throw_exception：直接抛出异常。\n   - `default-fallback-value`：当加密策略没有配置 `fallback-value` 的时候，将会直接返回此处配置的值。\n   - `arguments`：一般来说统一在yml中配置加解密的key就可以了，如果有字段需要单独使用其它key进行加解密，可以在此配置。\n    ```java\n    @Encrypt(strategy = CryptoStrategy.SM4, arguments = \"${custom.sm4.key}\")\n    private String name3;\n    \n    @Decrypt(strategy = CryptoStrategy.SM4, arguments = \"${custom.sm.key:1234567812345678}\")\n    private String name4;\n    ```\n\n### 3. 支持在 controller 使用 `@IgnoreCrypto` 注解忽略加密解密，同时支持忽略指定的字段\n\n```java\n@IgnoreCrypto\n@PostMapping(\"/ignore1\")\npublic ResponseEntity\u003cCryptoEntity\u003e ignore1(@RequestBody CryptoEntity cryptoEntity) {\n    return ResponseEntity.ok(cryptoEntity);\n}\n\n@PostMapping(\"/ignore2\")\n@IgnoreCrypto({\"name2\", \"mobilePhone2\", \"description2\"})\npublic ResponseEntity\u003cCryptoEntity\u003e ignore2(@RequestBody CryptoEntity cryptoEntity) {\n    return ResponseEntity.ok(cryptoEntity);\n}\n```\n\n### 4. 将默认的 Jackson 切换为 FastJson（不推荐）\n\n1. 加入 FastJson 依赖（支持 FastJson1 和 FastJson2）：\n    ```xml\n    \u003cdependency\u003e\n      \u003cgroupId\u003ecom.alibaba\u003c/groupId\u003e\n      \u003cartifactId\u003efastjson\u003c/artifactId\u003e\n      \u003cversion\u003e1.x.x/2.x.x\u003c/version\u003e\n    \u003c/dependency\u003e\n    ```\n2. 将 `FastJsonHttpMessageConverter` 声明为 Bean 即可，`sensitive-spring-boot-starter` 会自动注入相关逻辑。\n    ```java\n    @Bean\n    public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {\n      return new FastJsonHttpMessageConverter();\n    }\n    ```\n\n## 微信公众号\n\n\u003cimg src=\"./docs/images/WeChat-MP.png\" width=\"453\" height=\"150\" alt=\"会打篮球的程序猿\"\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flzhpo%2Fcrypto-spring-boot-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flzhpo%2Fcrypto-spring-boot-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flzhpo%2Fcrypto-spring-boot-starter/lists"}