godaddy/asherah
GitHub: godaddy/asherah
一个企业级应用层加密 SDK,通过信封加密和多层级密钥管理为敏感数据提供合规级保护。
Stars: 81 | Forks: 50
[](https://github.com/godaddy/asherah/blob/main/LICENSE)
[](https://circleci.com/gh/godaddy/asherah)
[](https://codecov.io/gh/godaddy/asherah)
# Asherah
一个应用层加密 SDK,提供高级加密功能和针对入侵的纵深防御。
其目标是提供一个易于使用的库,抽象化内部复杂性,并以企业级规模为考量实现快速、频繁的密钥轮换。
## 目录
* [简介](#introduction)
* [入门指南](#getting-started)
* [示例应用](#sample-applications)
* [延伸阅读](#further-reading)
* [支持的语言](#supported-languages)
* [功能支持](#feature-support)
* [贡献](#contributing)
## 简介
Asherah 结合使用了多层密钥以及一种被称为“信封加密”的技术。信封加密是一种实践,其中用于加密数据的密钥本身被更高层级的密钥加密,并与加密数据存储在一起,从而形成信封结构。在密钥层级根节点使用的主密钥通常由硬件安全模块 (HSM) 或密钥管理服务 (KMS) 管理。
该 SDK 在分层模型中生成加密强度高的中间密钥,并通过可插拔的后端数据存储管理其存储。与层级中根(主)密钥的 HSM 或 KMS 提供商的集成使用类似的可插拔模型实现。这允许支持适用于不同架构的多种数据存储和云提供商。
该 SDK 提供多种语言的实现,利用原生互操作机制在堆外受保护内存中安全地管理和缓存内部生成的密钥。安全的内存管理与分层密钥模型的分区相结合,有助于在发生入侵时最大限度地减少攻击暴露面。使用受保护的内存缓存还有一个额外的好处,即减少与外部资源的交互,从而改善延迟并最大限度地降低产生的成本。
## 入门指南
SDK 的基本使用分为 3 个步骤:
### 步骤 1:创建会话工厂
需要一个会话工厂来生成加密/解密会话。为了简单起见,会话工厂使用构建器模式,特别是 _分步构建器_ (step builder)。这确保在构建工厂之前设置所有必需的属性。
要获取构建器的实例,请使用静态工厂方法 `newBuilder`。一旦有了构建器,就可以使用 `withXXX` setter 方法来配置会话工厂属性。
下面是一个使用内存持久化和静态密钥管理的会话工厂示例。
```
SessionFactory sessionFactory = SessionFactory.newBuilder("some_product", "some_service")
.withInMemoryMetastore() // in-memory metastore
.withNeverExpiredCryptoPolicy()
.withStaticKeyManagementService("thisIsAStaticMasterKeyForTesting") // hard-coded/static master key
.build());
```
### 步骤 2:创建会话
使用工厂创建会话。
```
Session sessionBytes = sessionFactory.getSessionBytes("shopper123");
```
会话的范围仅限于一个分区 ID,即每个分区 ID 应该有自己的会话。另请注意,使用某个分区 ID 加密的 payload 不能使用另一个分区 ID 解密。
### 步骤 3:使用会话完成加密任务
SDK 支持 2 种使用模式:
#### 加密 / 解密
这种使用方式类似于常见的加密工具,payload 只是被简单地加密和解密,存储责任完全取决于调用应用程序。
```
String originalPayloadString = "mysupersecretpayload";
// encrypt the payload
byte[] dataRowRecordBytes = sessionBytes.encrypt(originalPayloadString.getBytes(StandardCharsets.UTF_8));
// decrypt the payload
String decryptedPayloadString = new String(sessionBytes.decrypt(dataRowRecordBytes), StandardCharsets.UTF_8);
```
#### 存储 / 加载
此模式使用键值/文档存储模型。`Session` 可以接受 `Persistence` 实现并挂钩到其加载和存储调用中。
示例 `HashMap` 支持的 `Persistence` 实现:
```
Persistence dataPersistence = new Persistence() {
Map mapPersistence = new HashMap<>();
@Override
public Optional load(String key) {
return Optional.ofNullable(mapPersistence.get(key));
}
@Override
public void store(String key, JSONObject value) {
mapPersistence.put(key, value);
}
};
```
综上所述,以下是存储和加载调用的端到端使用示例:
```
// Encrypts the payload, stores it in the dataPersistence and returns a look up key
String persistenceKey = sessionJson.store(originalPayload.toJsonObject(), dataPersistence);
// Uses the persistenceKey to look-up the payload in the dataPersistence, decrypts the payload if any and then returns it
Optional payload = sessionJson.load(persistenceKey, dataPersistence);
```
## 示例应用
[samples](/samples) 目录包含演示如何使用各种语言和平台使用 Asherah SDK 的示例应用。
## 延伸阅读
* [设计与架构](docs/DesignAndArchitecture.md)
* [系统要求](docs/SystemRequirements.md)
* [密钥管理服务](docs/KeyManagementService.md)
* [元数据存储](docs/Metastore.md)
* [密钥缓存](docs/KeyCaching.md)
* [代码结构](docs/CodeStructure.md)
* [SDK 内部机制](docs/Internals.md)
* [测试方法](docs/TestingApproach.md)
* [常见问题解答](docs/FAQ.md)
## 支持的语言
* [Java](java/app-encryption)
* [.NET](csharp/AppEncryption)
* [Go](go/appencryption)
* [服务层](/server)
### 衍生项目
基于 [Asherah SDK for Go](go/appencryption) 构建的 [Asherah-Cobhan](https://github.com/godaddy/asherah-cobhan) 实现。
* [Node.JS](https://github.com/godaddy/asherah-node)
* [Ruby](https://github.com/godaddy/asherah-ruby)
* [Python](https://github.com/godaddy/asherah-python)
### 功能支持
* AWS KMS 支持
* RDBMS 元数据存储
* DynamoDB 元数据存储
* 会话缓存
* 加密/解密模式
* 存储/加载模式
## 贡献
欢迎所有贡献者和贡献!请参阅我们的[贡献文档](CONTRIBUTING.md)了解更多信息。
标签:C++加密, GoDaddy开源, Go加密, HSM支持, IPv6支持, Java加密, JS文件枚举, KMS集成, ProjectDiscovery, Python加密, 企业级安全, 信封加密, 分层加密, 加密SDK, 加密库, 多人体追踪, 多语言支持, 安全测试框架, 密钥轮换, 应用层加密, 数据保护, 数据防泄露, 日志审计, 硬件安全模块, 网络安全, 防御深度, 隐私保护, 零信任架构