@ anywalletkit/ extension- kit (英语)
非拘禁铬(MV3)钱包扩展的安全相关核心,
在任何钱包套件和协议包上所建:加密金库
自动锁解锁键会话, dApp 请求路由器, 并带有原产地
权限和批准队列、签名请求分类和
审查交换和收入计划方面的帮助者。 没有UI,没有 @types/chrome,没有网络
本身的代码: 铬适配器取结构对象
(单位:千美元)StorageAreaLike, (中文(简体) ), AlarmsLike),所以一切运行在维特下与
内膜适配器.
安装
npm install @anywalletkit/extension-kit
# or: pnpm add @anywalletkit/extension-kit · yarn add @anywalletkit/extension-kit
时间: @ anywalletkit/ extension- kit (英语)发表于 发布工作流程 与出处.
这个软件包是给建立自己的扩展名的钱包开发者的. 这是一个 库,不是扩展:弹出、批准窗口、注入提供者, 服务工人的接线、建造和释放管道是钱包的。 虚空 浏览器扩展是一个基于它的产品.
pnpm add @anywalletkit/extension-kit @anywalletkit/core @anywalletkit/keyring
它提供的东西
| 区域 | 出口 | 什麽 |
|---|---|---|
| 默认 | Vault, (中文(简体) ), chromeLocalVaultStorage, (中文(简体) ), memoryVaultStorage, (中文(简体) ), VAULT_SCRYPT, (中文(简体) ), VAULT_LIMITS, (中文(简体) ), VAULT_MIN_PASSWORD_LENGTH | 每一个秘密在休息 chrome.storage.local,两个密钥层(一个KEK包装一个DEK,DEK封装每个密钥);密码(WebAuthn PRF)解锁为同一个DEK的第二包 |
| 会议 | Session, (中文(简体) ), chromeSessionStorage, (中文(简体) ), chromeAlarms, (中文(简体) ), SESSION_DEFAULT_AUTOLOCK_MS | dEK 输入 chrome.storage.session 带有过期和警报; getKey() 重新检查过期本身 |
| 密钥环适配器 | chromeKeyringStorage, (中文(简体) ), vaultSecretStorage | @anywalletkit/keyring 作为普通JSON的元数据,通过金库的秘密,每个呼叫一个DEK |
| 中继 | PageRequest 编号 : RelayRequest 有形体和卫士, isRelayMethod, (中文(简体) ), pageRequestFrom, (中文(简体) ), stampOrigin, (中文(简体) ), checkSenderOrigin, (中文(简体) ), RELAY_ERRORS | 页面 qq 内容脚本 qq 服务人员信息; 内容脚本只取页面窗口本身发布的信息( )pageRequestFrom(event, window): 一个iframe's parent.postMessage 不是网站),来源是浏览器的(port.sender),从来没有页面 |
| 路由器 | RequestRouter, (中文(简体) ), READ_METHODS, (中文(简体) ), SIGNING_METHODS, (中文(简体) ), toRelayError | dApp可能称为: 仅核算连接源, 链加/ 切换通过批准窗口, 从钱包本身的RPC读取, eth_sign 从来没有提供,所有其它4200 |
| 权限 | PermissionStore, (中文(简体) ), CHAIN_ACCOUNT_KEYS | 按原产地分列的账户(EVM、索拉纳、TON、Tron、Bitcoin、NEAR)和链条 |
| 核准 | ApprovalQueue, (中文(简体) ), ReviewDeclined, (中文(简体) ), QueueLimitError, (中文(简体) ), APPROVALS_MAX_PENDING_PER_ORIGIN | 一次一个批准窗口,最多3个尚待处理的请求和1个待处理的请求 connect; 运输票据(setVia(用于钱包连接端口) |
| 签名 | classifySignRequest, (中文(简体) ), prepareTransaction, (中文(简体) ), createSignHandler, (中文(简体) ), messageText | 连接地址和连锁检查,来自网站的EIP-7702代表团被拒绝,钱包的RPC中的非ce/ gas/费用 |
| 网络 | NetworksTable, (中文(简体) ), DEFAULT_NETWORKS, (中文(简体) ), parseAddChainParams,索拉纳 / TON / Tron 端点 | 具有公共RPC故障列表的EVM网络; wallet_addEthereumChain 仅用于目录链,仅限https, eth_chainId 经核实、现场提供的RPC盖章 custom |
| 审查门 | ReviewGate, (中文(简体) ), evmCallMatcher, (中文(简体) ), chainTxMatcher | 经过一张单子审查整个计划后,这些操作正好在TTL内通过一次 |
| 交换 | quoteRoutes, (中文(简体) ), reviewSwapPlan, (中文(简体) ), executionFloor, (中文(简体) ), SwapsStore, (中文(简体) ), SwapTracker, (中文(简体) ), parseSwapId | 累进引出于互换2提供者,每计划一份审查表(列出无气量订单并配以EIP-712散列),与审查账户挂钩的预先核准书(meta.account),在工人重启之前恢复互换 |
| 赚 | reviewEarnPlan, (中文(简体) ), earnPlanMatchers | ein 模块计划(核准+调用)的一张工作表,绑定在 meta.account |
| TON 连接 | parseConnectRequest, (中文(简体) ), parseSendTransaction, (中文(简体) ), parseSignData, (中文(简体) ), tonProofMessage, (中文(简体) ), tonSignDataMessage | tON 连接 v2 的纯数据半部分( 摘要) ton_proof 财务报告和审定财务报表 signData 签 名 、 以 校正 ; 帐号 signTonProof 编号 : signTonConnectData (华莱特顿) - sign() 拒绝32字节摘要 |
| 偷窥 | PhishingDetector | 元任务 eth-phishing-detect 列表格式, 随构建一起运出( 运行时从未获取 ); 拒绝列出的站点(refusal → refuse 打开 ApprovalQueue 财务报告和审定财务报表 RequestRouter, 4100, 无窗口; 模糊的外观, 标签上的品牌, 通码警告 |
| 塞拉利昂 | parseSiwe, (中文(简体) ), siweProblems, (中文(简体) ), describeSiwe | EIP-4361 登录信件:域名与询问站点,地址,链条,过期,非ce(警告) |
| 解决中毒问题 | lookalikeOf, (中文(简体) ), RecipientBook | 当新收件人模仿用户确认时警告 |
| 网络认证 | verifyAssertion, (中文(简体) ), approvalChallenge, (中文(简体) ), derToRaw, (中文(简体) ), rawToDer | ES256断言检查"每张签名上的密码";工人从来不相信页面的字眼 |
安保模式(摘要)
- 钥匙在休息. 信封 v2: scrypt N=2^17 r=8 p=1 (中文(简体) )
@noble/hashes页:1 AES-256-GCM 包装了随机32字节的 DEK; DEK 封存 AAD 下的每一个秘密forgewallet-vault/secret/<id>(框不能互换). DEK盒子的AAD(AD) (英语) 绑定精确的 KDF 参数, 所以一个被编辑盐或成本的信封 磁盘上无法打开;unlock拒绝支付底价weak-kdf),以及 费用或规模以上VAULT_LIMITS(crypt N ^ 2^20, r 16, 第 4页;PBKDF2) ● 5 000 000次重复;1 000次秘密;32次密码;4次密钥) 运行( r)unsupported-envelope) (中文(简体) ). 给信封的书信被连载(一)Vault因此,平行进口的每个存储区域都保密。 单曲 信封(PBKDF2-SHA256、600,000个重联)仍未打开并重新封存 作为v2. 短于8个字符的密码被金库本身拒绝. 密码错误和篡改都是同样的失败(wrong-password) (中文(简体) ).create永不覆盖; 重置为显式destroy()。 。 。 . - 密码. 在HKDF-SHA256(PRF输出, 盐 = 证书 id; 密码保留恢复路径.
- 重接键.
changePassword重新包装同样的DEK,和removePasskey不收回一个DEK 的密码 。 被怀疑后 妥协,rotateVaultKey(password)做一个新鲜的DEK, 重新封装每 秘密,放下密码,写一个信封; 把返回的DEK交给session.unlock,它取代了旧的.setSecret拒绝一个不打开金库秘密的DEK. - 开封州. 只有DEK被保存,在
chrome.storage.session(只记录,可信任的上下文),每个读取处执行过期 提醒锁定; 此软件包的密钥缓冲器在使用后被零化 .unlock编号 :lock编号 :touch编号 :getKey一次跑一次,所以活动赛车 锁从不带钥匙回来. - 页面错误 .
toRelayError(e, { log })传递钱包本身的拒绝 (EIP-1193代码)和一个节点的JSON-RPC出错(代码,还原数据)与URL 删除; 其它内容是-32603 Internal error在页面上,然后去log。 。 。 . - 发源地. 内容脚本只转发页面窗口本身的内容
公布(
pageRequestFrom数字 :event.source是页面,event.origin联合国 因此,一个广告或嵌入一个iframe不能作为网站说话。 这个 服务工作者只在内容脚本时回答中继消息 印花来源等于port.sender.origin。权限是 键入源代码,从不使用 URL 页面或 WalletConnect 对等请求. - 请求. 所有披露账户或转移资金的事物都会经历
批准队列; 盲签( e)
eth_sign未提供;输入数据 另有一连串、部署和地点来源的EIP-7702代表团 拒绝; 只读的 RPC 到钱包本身的终点 . - 腾讯网. 该工具包除了RPC/提供者之外,不提出自己的请求 调用钱包电线 ; 钓鱼列表是钱包船的数据 .
钱包的工作留下的是什么:扩展页 CSP(script-src 'self',没有
远程图像,用于工人的宿主授权列表 fetch,孤立第三方
网络 SDKs (WalletConnect, Omniston) 在沙盒页面中, 可复制
释放构建和存储账户.
使用铬适配器
import {
Vault, Session, PermissionStore, NetworksTable, ApprovalQueue, RequestRouter,
chromeLocalVaultStorage, chromeSessionStorage, chromeAlarms, chromeJsonStorage,
chromeKeyringStorage, vaultSecretStorage, checkSenderOrigin, isRelayRequest, PORT_NAME,
} from '@anywalletkit/extension-kit'
// service worker
const vault = new Vault({ storage: chromeLocalVaultStorage(chrome.storage.local) })
const session = new Session({ storage: chromeSessionStorage(chrome.storage.session), alarms: chromeAlarms(chrome.alarms) })
// onboarding
const dek = await vault.create(password) // refuses if a vault exists or the password is too short
await vault.setSecret(dek, 'main', utf8(seedPhrase))
await session.unlock(dek) // dek is zeroized here
// @anywalletkit/keyring on top of the vault
const keyringStorage = chromeKeyringStorage(chrome.storage.local)
const secrets = vaultSecretStorage(vault, session) // VaultError('locked') once the session expired
// the dApp side
const permissions = new PermissionStore(chromeJsonStorage(chrome.storage.local, 'my-wallet.permissions'))
const networks = new NetworksTable(chromeJsonStorage(chrome.storage.local, 'my-wallet.networks'))
const approvals = new ApprovalQueue(myApprovalWindow) // chrome.windows.create({ type: 'popup' }) behind ApprovalWindow
const router = new RequestRouter({ permissions, networks, approvals, accounts, rpc, emit, sign })
chrome.runtime.onConnect.addListener((port) => {
if (port.name !== PORT_NAME) return
port.onMessage.addListener(async (msg) => {
if (!isRelayRequest(msg)) return
const origin = checkSenderOrigin(port.sender, msg.origin)
if (!origin) return // forged origin: dropped, not answered
const result = await router.handle(origin, msg.chain, msg.method, msg.params)
// post a RelayResponse { kind: 'response', id: msg.id, … } back on the port
})
})
memoryVaultStorage, (中文(简体) ), memorySessionStorage, (中文(简体) ), memoryAlarms, (中文(简体) ),
memoryJsonStorage 财务报告和审定财务报表 memoryApprovalWindow 是做测试的双胞胎.