使用 @mysten/seal 构建去中心化加密:开发者教程
隐私正在成为公共基础设施。在 2025 年,开发者需要让加密变得如存储数据一样简单的工具。Mysten Labs 的 Seal 正好提供了这样的解决方案——具有链上访问控制的去中心化密钥管理。本教程将教你如何使用基于身份的加密、门限安全和可编程访问策略构建安全的 Web3 应用程序。
简介:为什么 Seal 对 Web3 很重要
传统的云应用程序依赖于中心化的密钥管理系统,其中单一提供商控制对加密数据的访问。虽然方便,但这创造了危险的单点故障。如果提供商被攻击、离线或决定限制访问,你的数据将变得无法访问或易受攻击。
Seal 完全改变了这种模式。由 Mysten Labs 为 Sui 区块链构建,Seal 是一个去中心化密钥管理(DSM)服务,支持:
- 基于身份的加密,内容在离开你的环境之前就受到保护
- 门限加密,将密钥访问分布在多个独立节点上
- 链上访问控制,具有时间锁、代币门控和自定义授权逻辑
- 存储无关设计,可与 Walrus、IPFS 或任何存储解决方案配合使用
无论你是在构建安全消息应用程序、门控内容平台还是时间锁定资产转移,Seal 都提供了你需要的加密原语和访问控制基础设施。
开始使用
前提条件
在深入学习之前,确保你具有:
- 安装了 Node.js 18+
- 对 TypeScript/JavaScript 的基本了解
- 用于测试的 Sui 钱包(如 Sui Wallet)
- 对区块链概念的理解
安装
通过 npm 安装 Seal SDK:
npm install @mysten/seal
你还需要 Sui SDK 进行区块链交互:
npm install @mysten/sui
项目设置
创建一个新项目并初始化它:
mkdir seal-tutorial
cd seal-tutorial
npm init -y
npm install @mysten/seal @mysten/sui typescript @types/node
创建一个简单的 TypeScript 配置:
// tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
核心概念:Seal 的工作原理
在编写代码之前,让我们了解 Seal 的架构:
1. 基于身份的加密 (IBE)
与传统的加密方式不同(你加密到公钥),IBE 让你加密到一个身份(如电子邮件地址或 Sui 地址)。接收者只有在能够证明他们控制该身份时才能解密。
2. 门限加密
Seal 使用 t-of-n 门限方案,而不是信任单个密钥服务器。你可以配置 3-of-5 密钥服务器,这意味着任何 3 个服务器可以合作提供解密密钥,但 2 个或更少的服务器不能。
3. 链上访问控制
访问策略由 Sui 智能合约强制执行。在密钥服务器提供解密密钥之前,它会验证请求者是否满足链上策略要求(代币所有权、时间约束等)。
4. 密钥服务器网络
分布式密钥服务器验证访问策略并生成解密密钥。这些服务器由不同的方运营,以确保没有单一控制点。
基本实现:你的第一个 Seal 应用程序
让我们构建一个简单的应用程序,它加密敏感数据并通过 Sui 区块链策略控制访问。
步骤 1:初始化 Seal 客户端
// src/seal-client.ts
import { SealClient } from '@mysten/seal';
import { SuiClient } from '@mysten/sui/client';
export async function createSealClient() {
// 为测试网初始化 Sui 客户端
const suiClient = new SuiClient({
url: 'https://fullnode.testnet.sui.io'
});
// 使用测试网密钥服务器配置 Seal 客户端
const sealClient = new SealClient({
suiClient,
keyServers: [
'https://keyserver1.seal-testnet.com',
'https://keyserver2.seal-testnet.com',
'https://keyserver3.seal-testnet.com'
],
threshold: 2, // 2-of-3 门限
network: 'testnet'
});
return { sealClient, suiClient };
}
步骤 2:简单加密/解密
// src/basic-encryption.ts
import { createSealClient } from './seal-client';
async function basicExample() {
const { sealClient } = await createSealClient();
// 要加密的数据
const sensitiveData = "这是我的秘密消息!";
const recipientAddress = "0x742d35cc6d4c0c08c0f9bf3c9b2b6c64b3b4f5c6d7e8f9a0b1c2d3e4f5a6b7c8";
try {
// 为特定的 Sui 地址加密数据
const encryptedData = await sealClient.encrypt({
data: Buffer.from(sensitiveData, 'utf-8'),
recipientId: recipientAddress,
// 可选:添加元数据
metadata: {
contentType: 'text/plain',
timestamp: Date.now()
}
});
console.log('加密数据:', {
ciphertext: encryptedData.ciphertext.toString('base64'),
encryptionId: encryptedData.encryptionId
});
// 稍后,解密数据(需要适当的授权)
const decryptedData = await sealClient.decrypt({
ciphertext: encryptedData.ciphertext,
encryptionId: encryptedData.encryptionId,
recipientId: recipientAddress
});
console.log('解密数据:', decryptedData.toString('utf-8'));
} catch (error) {
console.error('加密/解密失败:', error);
}
}
basicExample();
使用 Sui 智能合约的访问控制
Seal 的真正威力来自可编程访问控制。让我们创建一个时间锁定加密示例,其中数据只能在特定时间后解密。
步骤 1:部署访问控制合约
首先,我们需要一个定义访问策略的 Move 智能合约:
// contracts/time_lock.move
module time_lock::policy {
use sui::clock::{Self, Clock};
use sui::object::{Self, UID};
use sui::tx_context::{Self, TxContext};
public struct TimeLockPolicy has key, store {
id: UID,
unlock_time: u64,
authorized_user: address,
}
public fun create_time_lock(
unlock_time: u64,
authorized_user: address,
ctx: &mut TxContext
): TimeLockPolicy {
TimeLockPolicy {
id: object::new(ctx),
unlock_time,
authorized_user,
}
}
public fun can_decrypt(
policy: &TimeLockPolicy,
user: address,
clock: &Clock
): bool {
let current_time = clock::timestamp_ms(clock);
policy.authorized_user == user && current_time >= policy.unlock_time
}
}