hpgrahsl/kryptonite-for-kafka

GitHub: hpgrahsl/kryptonite-for-kafka

Apache Kafka 生态的客户端字段级加密库,通过 Connect SMT、ksqlDB/Flink UDF 和 HTTP API 等多种集成方式实现敏感数据的选择性加密与解密。

Stars: 92 | Forks: 9

# Kryptonite for Kafka:Apache Kafka® 的客户端 🔒 字段级 🔓 加密 **免责声明:这是一个非官方的社区项目!** ## 概述 Kryptonite for Kafka 是一个库,用于在记录进出 [Apache Kafka®](https://kafka.apache.org/) 时对其执行字段级加密。目前,它主要针对以下用例: 1. 基于 [Kafka Connect](https://kafka.apache.org/documentation/#connect) 的 [数据集成场景](connect-transform-kryptonite/README.md),通过开箱即用的 [转换](https://kafka.apache.org/documentation/#connect_transforms) (SMT),对带有或不带有 schema 的记录的选定字段运行加密/解密操作 2. 基于 [ksqlDB](https://ksqlDB.io) 的 [流处理场景](ksqldb-udfs-kryptonite/README.md),通过提供自定义 [用户定义函数](https://docs.ksqldb.io/en/latest/reference/user-defined-functions/) (UDF),分别加密/解密 STREAM 和 TABLE 中的选定数据列 3. 基于 [Flink](https://flink.apache.org/) Table API / Flink SQL 的 [流处理场景](flink-udfs-kryptonite/README.md),通过提供自定义 [用户定义函数](https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/dev/table/functions/udfs/) (UDF),加密/解密 Flink TABLE 中的选定数据列 4. [跨语言/运行时场景](funqy-http-kryptonite/README.md),通过运行同位的 [Quarkus](http://quarkus.io) [Funqy](https://quarkus.io/guides/funqy) 服务,暴露轻量级 web API,以便从任何通过 HTTP 通信的客户端应用程序加密/解密 payloads 或其中的字段。 ### 构建、安装和部署 您可以通过 Maven 从源代码构建此项目,也可以下载最新 Kryptonite for Kafka 工件的预构建、自包含包。 ##### Kafka Connect SMT 从 Kryptonite for Kafka 0.4.0 开始,可以直接从 [发布页面](https://github.com/hpgrahsl/kryptonite-for-kafka/releases) 下载预构建的 Kafka Connect SMT。 为了部署此自定义 SMT,**将解压后归档的根文件夹放入您的 _'connect plugin path'_** 中,该路径配置为在 kafka connect worker 节点启动期间进行扫描。 之后,为您的任何 source/sink connector 配置 Kryptonite 的 `CipherField` 转换。**在此阅读有关配置选项以及如何基于简单示例 [应用 SMT](connect-transform-kryptonite/README.md) 的信息。** ##### ksqlDB UDFs 从 Kryptonite for Kafka 0.4.0 开始,可以直接从 [发布页面](https://github.com/hpgrahsl/kryptonite-for-kafka/releases) 下载预构建的 ksqlDB UDFs。 为了部署 UDFs,**将 jar 包放入您的 _'ksql extension directory'_** 中,该目录配置为在 ksqlDB 服务器进程启动期间进行扫描。 之后,开始使用 UDFs,即 `K4KENCRYPT` 和 `K4KDECRYPT`,分别选择性地加密/解密 `TABLES` 和 `STREAMS` 中 ksqlDB 行的列值。**在此阅读有关配置选项以及如何基于简单示例 [应用 UDFs](ksqldb-udfs-kryptonite/README.md) 的信息。** ##### Flink UDFs 从 Kryptonite for Kafka 0.5.0 开始,可以直接从 [发布页面](https://github.com/hpgrahsl/kryptonite-for-kafka/releases) 下载预构建的 Flink UDFs。 为了部署 UDFs,**将 jar 包放入 _'flink libraries directory'_** 中,该目录配置为在 Flink 集群启动期间进行扫描。 之后,开始使用可用的 UDFs,即 `K4K_ENCRYPT, K4K_ENCRYPT_ARRAY, K4K_ENCRYPT_MAP` 和 `K4K_DECRYPT, K4K_DECRYPT_ARRAY, K4K_DECRYPT_MAP`,选择性地加密/解密 Flink `TABLE` 行中的列值。**在此阅读有关配置选项以及如何基于简单示例 [应用 UDFs](flink-udfs-kryptonite/README.md) 的信息。** ##### Quarkus Funqy HTTP API 服务 从 Kryptonite for Kafka 0.4.0 开始,可以直接从 [发布页面](https://github.com/hpgrahsl/kryptonite-for-kafka/releases) 下载预构建的 Quarkus 应用程序。 从源代码构建并在开发模式下运行 Quarkus 应用程序(`./mvnw quarkus:dev` 或 `quarkus dev`)之前,请确保在 `application.properties` 中指定您的个人配置选项。如果您在生产模式下运行预构建的二进制文件(`java -jar target/quarkus-app/quarkus-run.jar`),则必须在启动应用程序时正确覆盖任何强制性/默认设置。**在此阅读有关配置选项以及如何基于示例请求 [使用 HTTP API](funqy-http-kryptonite/README.md) 的信息。** ### 加密算法细节 该项目使用关联数据的认证加密 ([AEAD](https://en.wikipedia.org/wiki/Authenticated_encryption)),特别是应用 [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) [GCM](https://en.wikipedia.org/wiki/Galois/Counter_Mode) 模式进行概率加密(默认),或 [SIV](https://en.wikipedia.org/wiki/AES-GCM-SIV) 模式用于要求或至少受益于确定性加密的用例。首选且新的默认方式是将 Kryptonite 配置为使用 Google 的 [Tink](https://github.com/tink-crypto) 多语言、跨平台开源加密库。 #### Kryptonite for Kafka 0.4.0+ 版本 开箱即用提供以下加密算法。可以通过使用您自己的实现扩展核心库来添加其他算法: - 基于 Tink 实现的 **AES GCM 模式用于概率加密** 的 [AEAD](https://developers.google.com/tink/aead) - 基于 Tink 实现的 **AES SIV 模式用于确定性加密** 的 [DAEAD](https://developers.google.com/tink/deterministic-aead) 这些加密原语支持 _关联数据的认证加密_ (AEAD)。这基本上意味着除了密文之外,加密字段还包含未加密但经过认证的元数据。为了保持每个加密字段的存储开销相对较低,该实现目前仅包含 Kryptonite 本身的版本标识符,以及代表算法的短标识符和用于加密该字段的密钥集标识符。未来版本可能会受益于额外的元数据。 按照设计,在概率模式下对特定记录字段每次应用 AEAD 都会导致同一明文产生不同的密文。这通常不仅是可取的,而且对于增加攻击难度非常重要。然而,在 Kafka 记录的上下文中,这对于生产客户端(例如 source connector)会产生不利的后果。**在概率模式下对源记录的 key 应用 Kryptonite AEAD 会导致“分区混乱”**,因为具有相同原始明文 key 的记录最终会进入不同的 topic 分区。换句话说,**如果您计划将 Kryptonite 用于源记录 key,请确保将其配置为应用确定性 AEAD,即 AES SIV 模式**。这样做可以安全地支持记录 key 的加密,并保持 topic 分区和记录顺序完整。 #### Kryptonite for Kafka 0.6.0+ 版本 Kryptonite for Kafka 额外提供使用 FF3-1 算法的 **[格式保留加密](https://en.wikipedia.org/wiki/Format-preserving_encryption) (FPE)**。与产生可变长度密文的标准 AEAD 加密不同,FPE 保留明文数据的原始格式和长度。 _注意:理想情况下,该库应该提供 FF1,这是一种不同的 FPE 加密算法。然而,存在专利声明和版权禁止其在开源软件中使用。由于没有其他明显更好的 FPE 加密替代方案,因此选择 FF3-1 作为次优选择,它是经过 NIST 审查的,并且至少在现场得到了一定的应用。_ #### FPE 的关键特性 - **格式保留**:加密数据保持与原始明文相同的格式和长度 - **字符集保留**:密文使用与明文相同的字符集(字母表) - **用例**:适用于加密数据必须符合特定格式的场景,例如: - 信用卡号 (CCN) - 社会保障号 (SSN) - 电话号码 - 账号 - 具有严格格式约束的数据库列 ## 捐赠 如果您喜欢这个项目并希望支持其未来的开发和维护,我们欢迎您的 [PayPal 捐赠](https://www.paypal.com/donate/?hosted_button_id=NUCLPDTLNJ8KE)。 ## 许可证信息 本项目根据 [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) 授权 ``` Copyright (c) 2021 - present. Hans-Peter Grahsl (grahslhp@gmail.com) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ```
标签:Apache Flink, Apache Kafka, HTTP API, JS文件枚举, Kafka Connect, ksqlDB, Quarkus, SMT, UDF, 代码规范检查, 域名枚举, 大数据, 字段级加密, 敏感数据, 数据加密, 数据脱敏, 数据集成, 流处理, 目录扫描, 端到端加密, 网络安全, 软件成分分析, 隐私保护