惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
腾讯CDC
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
博客园_首页
D
DataBreaches.Net
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
月光博客
月光博客
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
Vercel News
Vercel News
WordPress大学
WordPress大学
J
Java Code Geeks
博客园 - 聂微东
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42

BAIYUN'S BLOG

AI Coding 从小工到专家 - BAI YUN 电信 IPTV 内网融合教程:在局域网任意设备观看 IPTV - BAI YUN 美国住宅 IP 提供商体验对比 - BAI YUN 高效优雅的观影指南 - BAI YUN 基于 Surge 的 DNS 优化指南 - BAI YUN RIME 鼠须管输入法简明使用教程 - BAI YUN 自动给不同 Git 项目设置不同的用户名邮箱 - BAI YUN Web3 新手如何选择加密货币钱包 - BAI YUN Web3 到底是什么? - BAI YUN 谨慎开启 Safari 的阻止跨站跟踪功能 - BAI YUN iOS Surge 开启后无法使用部分国产 APP 或网络出错的解决办法 - BAI YUN 屏蔽 Telegram 垃圾私信的有效办法 - BAI YUN 每个人都应该读一遍《1984》和《动物庄园》 - BAI YUN iOS 给常见机构号码增加联系人头像 - BAI YUN 在国内如何购买比特币和投资加密货币 - BAI YUN WEB 性能优化:如何让你的网站页面秒开(方法论) - BAI YUN 加密货币投资这件事 - BAI YUN 国内手机号注册推特教程 - BAI YUN 国内注册币安账号并通过 KYC 教程 - BAI YUN 使用一套助记词创建多个以太坊钱包账户 - BAI YUN Apple Watch 的几个用途 - BAI YUN 钱包安全指南:如何保护你的 NFT 和加密资产不被盗 - BAI YUN 我在 macOS 上高频使用的应用 - BAI YUN Web3 时代:如何使用 MetaMask 钱包实现一键登录 - BAI YUN 2022 年了 Safari 无法渲染渐变文字的 BUG 依旧存在 - BAI YUN 境外手机卡:澳门电信大湾区预付卡使用体验 - BAI YUN 解决 iCloud Drive 上传文件卡住的问题 - BAI YUN Electron 应用如何获取系统代理配置 - BAI YUN 解决 iOS 上 Google 账号登录会卡在加载状态的问题 - BAI YUN 记录 Github Copilot 惊讶到我的时刻 - BAI YUN
Node.js 程序以 Keyless 模式从 1Password 读取密钥 - BAI YUN
baiyun · 2024-10-28 · via BAIYUN'S BLOG

最近经常用 Node.js 写一些本地运行的脚本,需要安全的读取一些密钥密码之类的敏感信息,业界通常的做法是这样:

  • 通过环境变量读取
  • 通过在线的 KMS 系统读取

对于环境变量模式,一般情况需要在本地文件系统明文保存一些关键的密钥信息。本质上还是不太安全,例如你的钱包私钥明文放在本地文件系统,容易在未来的某一天爆雷,这种模式本质上不是无密码(Keyless)的。
对于 KMS 模式,需要依赖各种在线 KMS 服务,整体方案比较重,不太适合在本地电脑上轻量化使用。

本文使用 1Password 和官方提供的 CLI,在本地以无密码方式读取敏感信息。

具体方案

  1. 首先你需要是 1Password 用户(需要付费,家庭版比较实惠)
  2. 安装 CLI,我这里用 macOS 上的 brew 进行安装 brew install 1password-cli。具体可参考:https://developer.1password.com/docs/cli/get-started/
  3. 登录 1Password CLI:op account add
  4. 从 Node.js 读取指定的密钥
import { exec } from 'child_process'
import util from 'util'

const execPromise = util.promisify(exec)

// 使用内存缓存存储密钥
const secretCache = new Map<string, string>()

async function getSecretFromOnePassword(itemName: string, label: string): Promise<string> {
  const cacheKey = `${itemName}:${label}`

  // 检查缓存中是否已存在
  const cachedSecret = secretCache.get(cacheKey)
  if (cachedSecret) {
    console.log('从缓存获取密钥')
    return cachedSecret
  }

  console.log('从 1Password 获取密钥...')
  try {
    // 使用 op cli 获取 JSON 格式的 item 数据
    /*
        返回值示例:
        {
            "id": "xxx",
            "section": {
                "id": "add more"
            },
            "type": "CONCEALED",
            "label": "secret-key",
            "value": "xxx-value",
            "reference": "op://xxx/secret-key"
        }
        */
    const command = `op item get "${itemName}" --fields label="${label}" --format json`
    const { stdout } = await execPromise(command)

    // 解析返回的 JSON 并返回值
    const item = JSON.parse(stdout)
    if (item && item.value) {
      console.log('密钥获取成功')
      // 存入缓存
      secretCache.set(cacheKey, item.value)
      return item.value
    } else {
      throw new Error(`label "${label}" not found in item "${itemName}"`)
    }
  } catch (error) {
    console.error('从 1Password 获取密钥失败:', error)
    throw error
  }
}

1Password 字段说明

在执行脚本时,系统会弹出 1Password 确认框,待你确认后,程序就可以获取到对应的密钥。

1Password 授权确认框

结束语

本文用 Node.js 示范了如何在本地以 Keyless 模式读取 1Password 里的密钥,实现原理本质上是包装调用了 1Password 官方的 CLI 程序,其他语言例如 Python、Java、Golang 之类的也可以很轻松的实现本文的逻辑。
这套方案特别适合加密货币钱包私钥或者 root 账号私钥之类敏感内容,通过本文的方案可以满足可信消费和安全存储。

本文原载于:baiyun.me

原文链接:https://baiyun.me/nodejs-keyless-read-1password-secrets