TypeScript 的加密存储
可搜索,可应用级加密建设隐私-第一应用.
加密级别安全,没有痛苦
场级加密是保护数据的最强方法. 但如果DB功能或性能受损,你需要证明疼痛是合理的. 可搜索加密核 权衡:加密级安全无痛.
- 包括Supabase、RDS、Aurora、Prisma Postgres和Neon在内的任何Postgres的可搜索加密
- 与Supabase.js、Prisma Next、Drizzle或平地SQL合作
- 内置密钥管理——自动旋转,审计,最高快于AWS KMS
- 与Supabase Auth、办事员、Auth0和Okta合并
快速开始
使用向导
5到10分钟后开始 自由开发者级 (单位:千美元)注册),包括代理人交接.
# Run this to start (or just ask Claude to)
npx stash init
ORM/数据库专用指南
| 快开始 | 指南 |
|---|---|
| 苏巴基地 | Supabase快速启动 |
| Prisma 下一个 | Prisma 下一个快速启动 ~ |
| 滴入外科手术 | 滴滴快起动 ~ |
原始 PostgreSQL (英语:pg(中文(简体) ) | 快速启动 |
| 迪纳摩DB | 迪纳摩DB快速启动 ~ |
斯塔克号也运载了a
stash用于认证、计划和数据库设置的CLI。 见 SDK 参考。 。 。 .
堆栈里有什么
QQ 可搜索加密
在 PostgreSQL 中, 加密单个字段, 并仍然运行针对它们的真实的查询
| 查询类型 | 业务 | 文档 |
|---|---|---|
| 平等 | =, (中文(简体) ), IN | 平等问题查询 |
| 自由文本搜索 | 模糊 matches | 文本搜索 • |
| 范围排序( R) | <, (中文(简体) ), >, (中文(简体) ), BETWEEN, (中文(简体) ), ORDER BY, (中文(简体) ), MIN编号 :MAX | 范围查询 |
| 加密的 JSON | 封装( e)@>), JSONPath 选择器 | JSON查询 ∗ |
与 EQL v3 数据,列类型 实值 组合。 声明带有加密类型的列 来命名它的数据类型和它支持的操作,它准备查询——没有每栏 要维护客户端的搜索配置 :
CREATE TABLE users (
id serial PRIMARY KEY,
username text, -- plaintext — business as usual
email eql_v3_text_match, -- encrypted · free-text search
ssn eql_v3_text_eq, -- encrypted · equality
salary eql_v3_integer_ord, -- encrypted · range + ORDER BY
preferences eql_v3_json_search -- encrypted · containment + selectors
);
加密类型存在于文本,整数,浮出水面,数字,日期,时间戳,布林斯和JSON,所以
您的图案文档本身 —— 加密数据仍可使用标准的 Postgres 索引索引 。 没有
特殊的索引引擎,没有SQL重写. ORM 透明取出类型: 声明列为
加密为 schema.prisma 或者你的Drizzle桌子 和Stack处理其余的。 仅生 pg 需求
客户端 计划 - 以同类型名称申报:
import { encryptedTable, types } from "@cipherstash/stack/v3";
const users = encryptedTable("users", {
email: types.TextMatch("email"), // ↔ eql_v3_text_match
salary: types.IntegerOrd("salary"), // ↔ eql_v3_integer_ord
});
→ 可搜索加密 • 妇女 司马 • 妇女 加密解密( D) • 妇女 散装和模型操作
认证
您如何认证到 ZeroKMS 取决于谁要钥匙:
- 设备认证 ——基于浏览器的本地开发登录:
npx stash auth login打开您的 浏览器并保存证书到您的本地 CipherStash 配置文件 。 收回和壳里没有秘密. - 访问密钥认证 - 服务器、工人和CI的服务级别证书,通过
CS_*环境变量. - OIDC联合会 联合你的身份提供商的JWT 所以每个关键请求都认证 作为 注册用户而不是你的应用。 支助提供者: 苏柏碱 Auth, (中文(简体) ), 办事员, (中文(简体) ), 奥克塔,以及 自动 0 (任何符合OIDC的供应商的作品).
// Access key (default) — reads CS_* env vars, no config needed
const client = await Encryption({ schemas: [users] });
// OIDC federation — every ZeroKMS request authenticates as the end user
const client = await Encryption({
schemas: [users],
config: { authStrategy: OidcFederationStrategy.create(workspaceCrn, () => getUserJwt()) },
});
→ 认证
* 内置密钥管理
密钥管理由下列设备组成: 零KMS (零KMS) 没有AWS KMS可以监听 没有钥匙库可以运行, 没有轮回时间表 :
- 每个值的独有密钥 ——每表或每个数据库没有一把钥匙.
- 自动按键旋转 为你处理,零故障时间.
- CipherStash永远看不到你的钥匙. 键是 在应用程序中生成; 既不是简写 键或纯文本数据永远离开您的基础设施.
- 速成规模 ——大宗密钥操作在一次呼叫中可处理多达一万个密钥,最高可14×更快 高于峰值时的 AWS KMS(基准) (中文(简体) ).
- 每个解密都记录下来了 ——谁解密什么,何时解密的内置审计线索.
CipherStash从不看你的平话——或你的钥匙. 数据在您的应用程序中被加密 每个值的密钥,并且密钥在您的应用程序中通过 零KMS (零KMS) - 所以一个数据库 漏洞只泄露密码. 见安全架构
高级特性
身份锁定加密
在OIDC联合会的基础上,你可以将记录的加密密钥绑入终端用户的身份,所以只有
那个 用户可以解密其数据 : .withLockContext({ identityClaim }) 将数据密钥与索赔连接到
用户的JWT,由ZeroKMS强制加密.
// Bind the data key to a claim — the same claim is required to decrypt
await client
.encrypt("[email protected]", { table: users, column: users.email })
.withLockContext({ identityClaim: ["sub"] });
→ 身份锁定加密
用于多重租赁和主权的密钥集
将您的密钥分区到 键盘 ——单一工作空间内独立的关键等级. 各给
租户自有钥匙套(config.keyset密码租户隔离:每加密、解密和
查询被设定到一个密钥集, 因此取消客户对密钥集的访问使得租户的数据
无法读取, 直至补助金被恢复 —— 不重新存档您的应用 . 密钥集
加密的字段 。 真正的询问。 你的工具.
这个 email 下面一栏以每行独有的密钥存储为密码文本——搜索仍然有效,
因为查询运行在密码上。 没有解密和扫描, 没有重写查询 .
苏巴基地 – 相同的 Supabase.js 调用; 包装器内观您的方案, 在路上加密过滤器 并解密出场结果:
const db = await encryptedSupabase(supabaseUrl, supabaseKey);
const { data } = await db.from("users")
.select("id, name, email")
.eq("email", "[email protected]"); // encrypted equality — runs on ciphertext
Prisma 下一个 —— 宣布加密列为 schema.prisma,询问类型安全操作符 :
model User {
id String @id
email cipherstash.TextSearch()
}
const rows = await db.orm.public.User
.where((u) => u.email.eqlMatch("acme.com"))
.all();
滴水龙头 ——表格中的加密列类型,查询中的自动加密运算符:
export const usersTable = pgTable("users", {
id: integer("id").primaryKey(),
email: types.TextSearch("email"), // → eql_v3_text_search — the type is the config
});
const results = await db.select().from(usersTable)
.where(await ops.matches(usersTable.email, "acme.com"));
如何运作
加密发生在您的应用程序中 。 密码文本被存储为 电子质量L 数据库中的有效载荷; 纯文本和密钥永远无法到达 CipherStash. 按价值计的密钥由ZeroKMS批量发行(共计百万) ),每个解密都记录在遵守记录中.
→ 安保结构 • 妇女 零KMS (零KMS)
业绩
被加密的查询保持快速——延迟从10k行到10M行平. 以 EQL v3 计算 密码/管数字 :
| 运行 | 中位纬度(最多10M行) |
|---|---|
| 平等查询 | ~0.1毫秒(秒) |
| 区域查询 | ~0.5 ms (单位:千米) |
| JSON 实地平等 | ~0.1毫秒(秒) |
为什么SepherStash
- 信任的数据访问 ——只有你的终端用户才能通过强制加密的方式访问他们的敏感数据.
- 缩小爆炸半径 ——被突破的脆弱性只会暴露一个用户能够解密的东西,而不是你的整个表格.
- 审计线索 ——每一次解密事件都会被记录,没有额外的工具可以栓上.
- 更快地达到合规状态 ——超过SOC 2和ISO 27001的加密要求,符合FIPS要求 密码学和BYOK 对于需要的团队.
财务问题
CepherStash能看到我的数据还是加密钥匙吗?
不,从来没有。 加密和解密发生在您的应用程序中,密钥在您自己内部生成 环境。 Plaintext和密钥永远不会离开你的控制 也永远不会到达 CipherStash.
其规模有多高?
随着数据的增长,纬度保持不变——精确匹配的检查按~0.1 ms进行,范围查询按~0.5 ms进行 10k至 10M 行数密码/管ZeroKMS处理批量键(每台最多10 000个) 所以关键管理不是瓶颈.
移徙是什么样子?
在您的 Postgres 数据库中安装 EQL(npx stash init 编辑 快点开始 控件
,以此来声明您想要保护的列,并使用符合每个类型的加密类型(例如
eql_v3_text_match 可搜索文本或 eql_v3_integer_ord 区域查询),并加密数值
写之前的应用程序。 你可以逐行采用它——不重写大爆炸——和现有的
Postgres指数继续工作.
我一定要改变我写问题的方式吗?
勉强. 您保留您的查询构建器: Supabase.js 过滤器工作不变, Drizzle 和 Prisma Next
添加加密意识运算符( e)ops.eq, (中文(简体) ), ops.matches, (中文(简体) ), eqlMatch,...),取出正文并加密
给你的 没有 SQL 重写 .
我需要运行一个KMS或钥匙库?
没有 关键管理通过ZeroKMS构建. 如果您想要控制根键, 请带上自己的键 让你把它根植在自己的KMS.
它与Supabase Auth 和 Row Level Security合作吗?
对 它与Supabase Auth结合,并与RLS并列运行——它补充它们,不替换 他们.
我已经使用行级安全——我需要这个吗?
RLS和CepherStash解决了不同的问题,它们在一起最强. RLS 决定行 a
角色可以查询,但下面的数据是纯文本——所以绕过 RLS 的任何东西都会在
清除: 泄漏 service_role 键,一个配置错误的政策,一个 SQL 注入作为提升角色运行,
被盗备份,或数据库主机本身。 CipherStash 只存储密码文本并保存密钥
在数据库之外,所以这些相同的绕道 显示什么都无法读取。 保留 RLS 授权; 添加
密码系统 这样绕道就永远无法突破.
有免费的等级吗?
是的,一个免费的开发者级, 这样您就可以从第一天开始构建加密.
免费开始
加密比改造便宜得多 也就是解锁和企业 顾客。 开发者级别是 免费,这样您就可以从您的第一次迁移中添加加密:
npx stash init
签名是巫师的第一步,如果你还没有账户——或者
创建您的自由账户 首先在浏览器中,以及 stash init 我会捡起它.
安装
npm install @cipherstash/stack # or: yarn / pnpm / bun add @cipherstash/stack
[大 选择退出捆绑
@cipherstash/stack。 。 。 . 它使用本地的Node.js特性(一个 Rust FFI 模块)和 本地语言require。对于边缘和无服务器运行时间(Cloudflare Workers, Deno, Bun),使用方便捆绑器@cipherstash/stack/wasm-inline输入. Bundling 指南 +
所需经费: 节点.js 22.
文档社区( C)
- 📚 文档 • 妇女 快速启动 • 妇女 SDK 参考
- 🧩 示例应用程序
- 💬 Discord 社区