
前端桌面应用移动开发【免费下载链接】appThink fearlessly with end-to-end encrypted notes and files. For issues, visit https://standardnotes.com/forum or https://standardnotes.com/help.项目地址https://gitcode.com/gh_mirrors/ap/app点击查看免费下载SNCrypto Common 是 Standard Notes 应用仓库packages/sncrypto-common中负责定义密码学原语cryptographic primitives接口与类型契约的基础包它被上层加密引擎 snjs 直接依赖作为跨平台加密能力统一的协议层。本文将以该包为核心讲解其安装方式、算法清单、接口设计PureCryptoInterface与配套类型系统并结合仓库中的 Web 实现sncrypto-web说明底层原理读完你可以理解 Standard Notes 端到端加密链路中各算法的作用边界与接入方式。包定位加密能力的接口层而非实现层SNCrypto Common 的设计意图在其 README.md 中写得很明确它是SNJS 使用的加密原语Cryptographic primitives used by SNJS。从源码结构看本包只定义接口与类型不包含任何具体算法的落地实现目录 src/Common/PureCryptoInterface.ts 定义了核心接口PureCryptoInterface目录 src/AES-GCM、src/Base64、src/SHA 分别定义 AES-GCM、Base64、SHA-256 的细分接口目录 src/Types 存放共享的类型别名与枚举。真正跑起来的算法实现位于另一个包 packages/sncrypto-web/src/crypto.ts其中的SNWebCrypto类通过implements PureCryptoInterface完成接口落地由两部分能力拼装而成——浏览器内置 WebCrypto 与 Libsodium.js源码注释原文Built-in browser WebCrypto — Libsodium.js library integration。这种接口与实现分离的架构使得 snjs 上层业务可以完全面向PureCryptoInterface编程未来即使替换底层算法库例如引入原生 Node 实现上层数据流与持久化格式也不会受影响。安装与工程信息根据 README 与 package.json通过包管理器安装即可yarn add standardnotes/sncrypto-common工程层面值得注意的信息版本当前仓库内为1.13.9见 CHANGELOG.md发布通道为 npm 公开包standardnotes/sncrypto-common运行时约束engines声明node 16.0.0 17.0.0在旧版 Node 16 环境使用浏览器端使用则由 sncrypto-web 提供 UMD 构建依赖极少运行时仅依赖reflect-metadata构建产物仅发布dist目录许可证AGPL-3.0构建命令yarn buildTypeScript 编译、yarn lint/yarn testESLint 检查。支持的算法全景README 给出的支持算法清单如下其中每一项都对应PureCryptoInterface中的一个或多个方法并注明了底层来源算法底层来源对应接口方法Argon2idLibsodium.jsargon2()XChaCha20Poly1305Libsodium.jsxchacha20Encrypt()/xchacha20Decrypt()及流式接口PBKDF2WebCryptopbkdf2()AES-CBCWebCryptoaes256CbcEncrypt()/aes256CbcDecrypt()HMAC SHA-256—接口抽象hmac256()SHA256—接口抽象sha256()选择Libsodium.js WebCrypto双引擎而非单一实现是出于环境适配的考虑WebCrypto 是浏览器原生能力、无需加载额外二进制适合做 AES-CBC、PBKDF2 等标准算法而 Argon2id 与 XChaCha20 等算法在 WebCrypto 中没有原生支持必须依赖 Libsodium.js经 WebAssembly 加载来完成。README 中的算法清单在 packages/sncrypto-web/README.md 中完全一致进一步印证这是整个加密体系的标准能力集。核心接口 PureCryptoInterface 逐项解析PureCryptoInterface 是 snjs 使用加密能力的唯一入口接口注释明确写道Interface that clients have to implement to use snjs客户端必须实现该接口才能使用 snjs。按用途可将其方法分为以下几组1. 密钥派生Key Derivationpbkdf2(password: Utf8String, salt: Utf8String, iterations: number, length: number): Promisestring | null基于 WebCrypto 的 PBKDF2 派生password与salt均为 UTF-8 字符串length以比特为单位返回十六进制密钥串失败返回nullargon2(password: Utf8String, salt: HexString, iterations: number, bytes: number, length: number): HexString基于 libsodium 的crypto_pwhash_ALG_DEFAULT即 Argon2id。接口注释给出了两个关键参数的推荐取值iterationsopslimit推荐最小值 2bytesmemlimit推荐最小值 6710886464 MiB返回派生密钥的十六进制串。这两者对应不同的加密时代PBKDF2 用于早期加密数据Argon2id 用于较新方案。从 CHANGELOG.md 可以看到该包持续演进例如 1.12.0 引入 PKC 算法密钥生成/加密/解密1.13.0 引入实验性 005 operator——密钥派生与加密算法的迭代正是 Standard Notes 加密版本演进的基础。2. 对称加密Symmetric Encryptionaes256CbcEncrypt(plaintext, iv, key): PromiseBase64String/aes256CbcDecrypt(ciphertext, iv, key): PromiseUtf8String | nullAES-256-CBC接口标注为legacy仅用于旧版加密数据iv与key均为十六进制格式密文为 Base64解密失败返回nullxchacha20Encrypt(plaintext, nonce, key, assocData?): Base64String/xchacha20Decrypt(...)XChaCha20-Poly1305 AEAD 加密assocData为可选关联数据AAD用于绑定上下文、防篡改xchacha20Decrypt的assocData还支持Uint8Array流式加密四件套xchacha20StreamInitEncryptor(key)、xchacha20StreamEncryptorPush(encryptor, plainBuffer, assocData, tag?)、xchacha20StreamInitDecryptor(header, key)、xchacha20StreamDecryptorPush(...)。流式接口用于大文件分块加解密其中的tag参数由枚举 SodiumTag 定义PUSH / PULL / REKEY / FINALFINAL标记数据流收尾。3. 哈希与消息认证Hashing MACsha256(text): PromisestringSHA-256返回十六进制串hmac256(message, key): PromiseHexString | nullHMAC-SHA-256key为十六进制hmac1(...)与unsafeSha1(...)接口注释明确标注二者仅用于遗留legacy应用是标准 notes 早期体系的历史兼容项sodiumCryptoGenericHash(message, key?)libsodium 的通用哈希BLAKE2b密钥可选。4. 公钥密码Public Key CryptographyPKC自 1.12.0 起CHANGELOG 条目pkc algos for key generation, encrypt, and decrypt加入sodiumCryptoBoxSeedKeypair(seed): PkcKeyPair/sodiumCryptoSignSeedKeypair(seed): PkcKeyPair由种子派生密钥对sodiumCryptoBoxEasyEncrypt(...)/sodiumCryptoBoxEasyDecrypt(...)基于 Curve25519 的密封加密/解密sodiumCryptoSign(message, secretKey)/sodiumCryptoSignVerify(...)Ed25519 签名与验签sodiumCryptoKdfDeriveFromKey(key, subkeyNumber, subkeyLength, context)libsodium KDF 子密钥派生。密钥对结构由 PkcKeyPair 定义{ privateKey: HexString; publicKey: HexString }。5. 编码、随机数与安全工具Base64 三件套base64Encode/base64URLEncode/base64DecodeURL-safe 变体用于 OAuth 令牌等场景generateRandomKey(bits): HexString按比特位生成随机密钥generateUUID()同步生成 UUIDtimingSafeEqual(a, b): boolean常量时间字符串比较其实现位于 src/Common/Utils.ts——当两串长度不等时置result 1并按短串逐字符异或保证比较耗时不泄露长度与内容差异是防时序侧信道攻击的关键工具OTP 相关generateOtpSecret()TOTP 共享密钥注释引用 RFC 4226 建议至少 160 bits 32 个 base32 字符、hotpToken(secret, counter, tokenLength)RFC 4226、totpToken(secret, timestamp, tokenLength, step)RFC 6238时间戳单位毫秒、步长单位秒。独立细分接口与类型系统除PureCryptoInterface外包内还以模块拆分了更细的接口便于按能力聚合复用AES-GCMsrc/AES-GCM接口 CryptoAes256GcmInterface 提供aes256GcmEncrypt/aes256GcmDecrypt。输入结构 Aes256GcmInput 为{ unencrypted, iv, key, aad? }输出结构 Aes256GcmEncrypted 为{ iv, tag, ciphertext, encoding, aad }——tag即 GCM 认证标签与ciphertext分离存放AES-GCM 是目前文件内容加密的主流 AEAD 方案与旧版 AES-CBC 形成代际对比Base64src/Base64接口 CryptoBase64Interface 收敛 Base64 的编解码能力SHAsrc/SHA接口 CryptoSha256Interface 仅定义sha256(text): HexString类型层src/Types提供HexString、Base64String、Base64URLSafeString、Utf8String、SodiumTag、PkcKeyPair、StreamEncryptor/StreamDecryptor含SodiumStateAddress状态的流式对象以及 Unencrypted纯文本 UTF-8 字符串或带编码声明的字符串二选一等。这些具名字符串类型把十六进制、Base64、UTF-8 等格式在类型层面区分开从编译期就避免拿错格式的密钥/盐/密文这类加密应用最危险的错误。包的统一出口在 src/index.ts一行export * from汇总了 AES-GCM、Base64、Common、SHA 与 Types 五个子模块PureCryptoInterface等即通过此入口对外暴露。从接口到实现Web 端如何落地要直观理解这套接口的用法可看其唯一仓库内实现 packages/sncrypto-web/src/crypto.ts 中的SNWebCrypto构造函数即开始加载 libsodiumthis.ready sodium.ready凡用到 libsodium 的方法都必须先await this.ready或调用initialize()避免 WebAssembly 尚未就绪就执行加密操作pbkdf2的实现路径是stringToArrayBuffer转换密码 →webCryptoImportKey导入 PBKDF2 密钥仅授权deriveBits→webCryptoDeriveBits派生比特并转十六进制aes256CbcEncrypt则走crypto.subtle.encrypt并预先用hexStringToArrayBuffer把十六进制的 key/iv 转成 ArrayBuffergenerateRandomKey直接使用全局crypto.getRandomValuescrypto.ts 第 97-101 行。同时 packages/sncrypto-web/src/index.ts 还从本包 re-export 了SodiumConstant与SodiumTag可见类型契约在实现层被原样复用。在 Standard Notes 加密体系中的位置把视角放到整个仓库可以更清晰地看到分层sncrypto-common 定义加密能力长什么样接口与类型sncrypto-web 实现浏览器里怎么算WebCrypto Libsodium.js而 packages/sncrypto-common/README.md 所指的上层消费者 snjspackages/snjs/lib/Services下的各类服务再基于PureCryptoInterface完成笔记内容的加解密、密钥派生、文件分块加密等业务编排。因此当你在阅读 snjs 或 desktop / web 前端代码时看到PureCryptoInterface、HexString、SodiumTag等符号其契约定义都收敛在本包内——它是理解 Standard Notes 端到端加密数据格式的字典也是任何希望为其加密层提供新实现例如原生 Node 或移动端适配的开发者的首要接入点。赞分享前端桌面应用移动开发【免费下载链接】appThink fearlessly with end-to-end encrypted notes and files. For issues, visit https://standardnotes.com/forum or https://standardnotes.com/help.项目地址https://gitcode.com/gh_mirrors/ap/app点击查看免费下载相关推荐6种gruvbox-theme风格对比从Dark Hard到Light Soft的终极选择指南6种gruvbox theme风格对比从Dark Hard到Light Soft的终极选择指南 Gruvbox是一款复古风格的Emacs主题源自Vim版本的SNCrypto Web 密码学原语库实战指南基于 WebCrypto 与 Libsodium.js 的浏览器端加密实现解析SNCrypto Web 密码学原语库实战指南基于 WebCrypto 与 Libsodium.js 的浏览器端加密实现解析 SNCrypto Web 是 S前端桌面应用移动开发使用 aws_outposts_outposts 数据源批量查询 AWS Outposts 信息使用 aws_outposts_outposts 数据源批量查询 AWS Outposts 信息 本文以 terraform provider aws 官方文档前端桌面应用移动开发上一篇如何在RISC-V硬件上部署egos-2000从Tang Nano 20K到Arty A7的完整清单下一篇Ansible for Kubernetes AWS EKS部署教程在云端构建生产级Kubernetes集群创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考