服务如何生成和使用公共和秘密 API 密钥?

2024-02-04

Google、Stripe 和许多其他公司都有公共 API 密钥和秘密 API 密钥。

生成随机字符串很容易,但我的问题是,如何生成公钥和私钥、存储它们并正确使用它们?

公共 API 密钥用于告知用户是谁,秘密用于确认用户的身份。

我的流程如下: - 用户创建帐户 - 用户激活服务(内部) - 服务返回公共和秘密 API 密钥(UARRHAtPtJcLxx5RmMWo9oTrca4gRt2k、C9YS7Mhzichq2vqBuRkNJxkNci5W2Xua) - 用户在他/她的网站上使用公钥,在服务器端使用私钥

我使用的是nodejs,当用户请求API密钥时,公钥是按需生成的:

let public = await crypto.randomBytes(32).toString('base64');

将秘密存储在数据库中就像以明文存储密码一样。 我想我们不想要这个,它需要以某种方式进行散列。例如,我是否生成一个“私钥”并使用 argon2 对其进行哈希处理?用户将永远无法再次看到他/她的密钥,并且需要立即保存它,这是一个好的做法吗?

我找不到太多关于这应该如何工作的信息。


从技术上讲,您所指的只是用户名和密码。唯一重要的区别是这些通常由 API 生成并且非常随机,而不是由用户选择的真实用户名和密码,并且通常不是非常随机。 (调用这些公钥和私钥有点误导,因为公钥加密是不同的 - 通常不需要 API 密钥,管理 PKI 很麻烦,而且正确执行的成本也非常高。)

由于这些在技术上与用户名和密码相同,因此您希望以类似的方式对待它们。我们将这些称为客户端 ID(“公共”部分)和客户端密钥(“秘密”部分)。

一些想法:

  • 您应该使用加密安全的随机生成器来生成随机字符串。crypto.randomBytes()如上所述就可以了。
  • 您应该考虑熵来为密钥设置适当的长度。熵基本上是密钥的“随机性”,以位为单位进行测量。举个例子,如果密钥空间是 1024 个具有相同概率的不同可能密钥,那么您可以说该密钥具有 log2(1024) = 10 位熵。熵将密钥的长度与随机源的安全性解耦,例如,您可以拥有很长的密钥,但仍然不安全,因为随机源有缺陷。您想要的密钥有多少熵取决于用例,例如在任何情况下都可能进行离线攻击,或者仅在线请求等等(您也应该考虑离线攻击,这些攻击是very快速地)。根据经验,熵不应低于 128 位,为了获得更高的安全性,您可能应该使用 256 位以上。如果密钥区分大小写和字母数字,则有 62 个不同的可能字符,22 的密钥长度提供约 131 位(log2(62^22) =~ 130.99)。当然,您总是可以更长,对于 256 位,您需要 43 的长度,并且区分大小写的字母数字。
  • 正如您正确指出的那样,存储此类密钥至关重要。至少,您希望将它们存储为散列(使用适当的散列,见下文),就像任何其他密码一样,这样即使攻击者获得了对您数据库的访问权限,他们也不会看到您的 api 密钥。任何适当的密钥派生函数(Argon2、bcrypt、PBKDF2 等)都适合此目的,但普通加密哈希函数(sha1、sha2 等)是not.
  • 你是对的,如果你对这些秘密进行哈希处理,用户将只能在生成它们时才能看到它们,而再也不会看到它们。这正是安全在线服务中发生的情况,并且通常是一个很好的做法。您可以警告用户记下该秘密,因为您将无法再次向他们显示。 (此外,如果他们忘记了,他们最好可以生成一个新的,所以这通常不是什么大问题。)
  • 更好的办法是将这些密钥存储在其他地方。考虑到云,存储此类机密的好地方是云提供商提供的服务,例如 AWS 中的 Secrets Manager。好处包括使用 KMS 密钥进行加密、审核,并且您可以确保访问密钥的唯一方法是通过适当的 IAM 角色(例如,您无需担心泄露备份等问题)。
  • 虽然客户端 ID 不是秘密,但您需要在存储中保护其完整性(以及与客户端秘密关联的完整性)。想象一个场景,攻击者可以以某种方式更改您的数据库,并将不同的(攻击者已知的)客户端密钥分配给现有的客户端 ID。这意味着与该客户端 ID 相关的数据将被完全泄露。因此,您要确保除了保证客户端秘密的安全外,攻击者也不可能更改这些秘密(例如通过对所涉及组件的访问控制)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务如何生成和使用公共和秘密 API 密钥? 的相关文章

  • 具有匹配模式的 ioredis 密钥

    我想用键匹配模式 LOGIN 搜索 Redis 数据库 我在我的应用程序中使用 ioredis 昨天我搜索了整个网络 我得到了一些执行这项工作的选项 如下所示 KEYS 扫描流 Issue import Redis from ioredis
  • 找到 Webpack 配置文件但未配置条目

    我正在尝试为我的个人项目组织一个 webpack 2 模板webpack dev server并使用 npm 命令运行它 但我收到此错误 Configuration file found but no entry configured 这很
  • setInterval 可以随时间漂移吗?

    我有 2 个 Node js 网络服务器 我在网络服务器内缓存数据 我根据系统时间同步缓存加载 清除 我已经完成了所有主机的时间同步 现在我使用以下代码每 15 分钟清除一次缓存 millisTillNexthour Calculate m
  • 一个 Guice 就绪的安全框架?

    有没有人见过一个为与 Guice 一起工作而编写的框架 或者一个将现有安全系统 即 Acegi 与 Guice 集成的库 到目前为止我发现了以下内容 http code google com p warp security http cod
  • Node + Express .post 路由抛出错误。预期回调,获得对象

    我目前正在开发一个使用 Express Node 的应用程序 我最近添加了一个新的 post路线到app js文件 使用以下语法 app post api posts saveComment posts saveComment posts上
  • Node.js 有水豚吗?

    有谁知道 Node js 是否有类似 capybara 的东西 怎么样Zombie http zombie labnotes org 僵尸 js 使用 Node js 进行极其快速的无头全栈测试 The Bite 如果你要编写一个速度极快的
  • 节点检查器显示对象“无属性”

    我在调试场景中相当陌生 尤其是节点检查器 安装节点检查器后 我使用 debug 参数启动了简单的节点应用程序 并且能够在 localhost 8080 debug port 5858 处看到调试视图 当我让应用程序在此断点处停止时 rout
  • Typescript 和 Mongoose - “this”在实例方法中不可用

    我目前正在将我的 API 从 JS 转换为 TS 然而 我在猫鼬和打字稿方面遇到了一些困难 具体来说 this在我的实例方法中不可用 My code AccountSchema methods comparePassword async f
  • python:PyPi公共模块:如何确定是否安全?

    我已经完成了我的 python 3 应用程序 它正在使用 PyPi 的多个公共模块 然而 在我将其部署到我公司的企业 将处理客户的凭据并访问第 3 方 API 之前 我需要尽职调查确保它们既安全又安全 我必须执行哪些步骤 验证 PyPi 模
  • 使用admin sdk在云函数中执行firestore集合组查询?

    firestore collectionGroup 方法在云函数中与 firebase admin sdk 一起使用时出现错误 是否可以在云函数中对 firestore 进行集合组查询 这是我尝试使用的 firestore 查询方法 htt
  • 如何从控制器返回 PDF 文件

    我正在尝试使用 NestJs 从控制器端点返回 PDF 文件 未设置时Content typeheader 返回的数据getDocumentFile 很好地返回给用户 然而 当我添加标头时 我得到的返回似乎是某种奇怪形式的 GUID 响应总
  • 此 JavaScript 如何在 Firefox 中打开 Windows 设置?

    新安装 Firefox 45 开发版后 我看到了这个页面 它有一个按钮 让我们开始吧 单击该按钮时 会以某种方式打开选择默认应用程序Windows 10 中的设置页面 这是怎么做到的 我无法通过开发者控制台在该页面上迷宫般的代码中找到任何内
  • 如何使用 Web 套接字和 Angular CLI 设置代理

    我有一个使用 Angular CLI 构建的简单 Web 应用程序 我希望它使用网络套接字与后端通信 我已经编写了后端 并使用一个简单的 index html 页面进行了测试 服务器可以在套接字上发送和接收该页面 在我的 angular c
  • 如何更新 Sencha Touch 中的嵌套列表/树存储?

    我有一个嵌套列表 必须根据用户在 Ext Carousel 中选择的内容填充新数据 TreeStore load newData this does not work TreeStore removeAll this works 似乎文档和
  • express 或express-generator:我需要两者吗?

    只是探索 Node js 并遇到了 Express 在 npm 存储库站点上https www npmjs com package express https www npmjs com package express它明确指出安装是 np
  • 如何在 Node-Red 中的 oneditsave 之后在下拉列表中显示先前选择的值(动态)?

    我有一个自定义节点 其中包含两个彼此独立的下拉菜单 因此 第二个下拉列表值会根据第一个下拉列表中选择的值发生变化 我现在尝试的是 用户拖动我的自定义节点 iotinput 从两个拖放中选择值 按下并单击 完成 他再次拖动另一个自定义节点 i
  • 如何清除NPM的https代理设置?

    如何清除NPM之前的ssl代理设置 好吧 我搜索了很多 但我得到的所有帖子主要是关于如何set公司网络中的代理 我尝试将代理设置为空 npm config set http proxy npm config set https proxy
  • Node.js 中的异步或步骤

    我无法让我的异步代码与 node js 一起使用 尝试异步和步骤库 代码仅返回第一个函数 似乎没有执行其余函数 我究竟做错了什么 thanks var step require step step function f1 console l
  • 如何处理 MongoDB 的断开连接错误

    我在 Node js 进程中看到了这个未捕获的异常 Uncaught exception Error read ETIMEDOUT at TCP onStreamRead internal stream base commons js 16
  • "message": "ENOENT: 没有这样的文件或目录,打开 'E:\\astrology\\utils\\uploads\\1600798534862qf.png'"

    正如标题所示 我得到error message ENOENT no such file or directory open E astrology utils uploads 1600798534862qf png 在我的项目中 即使在通过

随机推荐

  • 点击事件中的全日历错误时间

    我正在使用角度和全日历 我有 令人惊讶的 时区问题 而且我似乎无法解决问题 如果在周视图中我点击 08 00 我打开一个模式并显示时间 我会看到 09 00 timezone Europe Brussels ignoreTimezone f
  • 枕头调整像素图像大小 - Django/Pillow

    我正在 Django 中开发一个图像上传器 图像上传并保存到磁盘后 我正在尝试调整保存的图像的大小 同时保持其纵横比 我正在使用 Pillow 进行图像处理 调整大小 当我尝试调整图像大小时出现问题 即使调整大小的图像的长宽比与原始图像的长
  • 使用 PHP 和 jQuery 生成并下载 .csv 文件

    我想生成一个 csv 文件 然后使用 AJAX 下载它 在现场 csv php 我有这个代码
  • 错误错误:未捕获(承诺):QuotaExceededError Ionic 3

    我正在使用 ionic 3 创建一个应用程序 我正在 ionic 存储中保存一个字符串 我工作得很好 但突然出现这个错误 Home ts 这是我设置字符串的地方 this storage set 123 JSON stringify dat
  • 如何跳过 x 轴上的标签?

    我已经尝试了很长一段时间来弄清楚如何跳过该图表 x 轴上的标签 例如 显示每第三个或第四个标签 我尝试将 autoSkip 和 stepSize 添加到刻度配置中 但没有任何变化 有没有一种简单的方法可以做到这一点 Edit visitor
  • 如何使用 JavaScript 检测我的浏览器版本和操作系统?

    我尝试使用下面的代码 但它只在 Chrome 和 Mozilla 中显示结果 在 IE6 中不起作用 div div
  • matplotlib 轴标签出现奇怪错误

    我对 Python 和一般编程都很陌生 所以如果我遗漏了一些明显的东西 请提前道歉 我正在尝试绘制图表并标记轴 但每次尝试标记 y 轴时都会引发异常 我在新脚本中编写了下面的代码 以确保问题不是来自模块中的其他地方 我正在使用Python
  • 未知目录的重写规则

    所以我试图获取 mod rewrite 规则来将请求重定向到带有 htaccess 文件的 php 脚本 问题是 我希望它能够工作 无论我将项目放在网络服务器上的哪个位置 htaccess 文件和 php 脚本始终位于同一文件夹中 重写本身
  • 读取 XMLStreamReader 时出错。获取故障响应

    我开发了一个应用程序 用户应该填写申请表并在最后付款 要付款 用户应在下面给出的链接中填写详细信息 Payment https k2 karnataka gov in wps portal Khajane II Scope Remittan
  • 在 Ubuntu 上安装 Python3 的 mod_wsgi

    谁能给我一套在 Ubuntu for Python 3 上安装 mod wsgi 的清晰说明 我确实使用 Python3 成功获得了 Flask 和 mod wsgi 并且短暂地感到高兴 直到我查看 Apache 的日志并意识到我遇到了这个
  • UnicodeDecodeError:无效的起始字节

    我有一个关于 UnicodeDecodeError invalid start byte 的快速问题 我认为我的文本中的某个地方有非 UTF 8 字符 但错误消息的位置是读取文件的起点 所以我不知道如何修复它 如果您有任何建议 请告诉我 以
  • Mysql 如何获取给定年份和月份的第一个星期一

    如何获取给定年份月份的第一个星期一 SET YearMonth 201304 Result 2013 04 01 For April 2013 11 04 For November 提前致谢 Try this SET firstday 20
  • 使用 CSVHelper 动态映射嵌套对象

    我正在使用 CSVHelper 感谢 Josh Close 来读取 CSV 文件 效果非常好 我现在尝试使用它将该文件映射到一些内部类 但是 我映射的 CSV 因客户而异 但都需要映射到我的内部类 我需要允许客户定义 CSV 如何映射到我的
  • 安装失败,并显示消息“INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME”

    因此 我在项目中对包名称进行了一些重构 现在我无法再安装我的应用程序 大约在同一时间 我更新到了 android studio 的最新版本 我相信这可能是问题所在 因为我认为我在升级之前进行了重构 我只是不记得 100 这是我的清单
  • 金字塔图案中圆的绘制方法

    我想在 HTML 画布上以金字塔图案绘制圆形球 像这样 小提琴 你可以向我展示算法 https jsfiddle net ofxmr17c 3 https jsfiddle net ofxmr17c 3 var canvas documen
  • Android OpenGL ES 应用程序的屏幕截图

    我有一个在已添加的 GLSurfaceView 上运行的基本 openGL ES 20 应用程序 GLSurfaceView view new GLSurfaceView this view setRenderer new OpenGLRe
  • 带有 multipart/form-data 的请求返回 415 错误

    我需要使用以下方式接收此请求Spring POST test HTTP 1 1 user agent Dart 2 8 dart io content type multipart form data boundary dio bounda
  • .htaccess http 到 https 重定向 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我目前正在使用以下 htaccess 将我的网站重定向到 https 和 www 如果尚未使用 RewriteEngine On RewriteCon
  • 如何在 XMLHttpRequest 中捕获 Chrome 错误 net::ERR_FILE_NOT_FOUND?

    我想创建 chrome 扩展 它将能够读取本地文件并使用其中编写的代码 我的简单代码是 const readFile filePath gt return new Promise function resolve reject const
  • 服务如何生成和使用公共和秘密 API 密钥?

    Google Stripe 和许多其他公司都有公共 API 密钥和秘密 API 密钥 生成随机字符串很容易 但我的问题是 如何生成公钥和私钥 存储它们并正确使用它们 公共 API 密钥用于告知用户是谁 秘密用于确认用户的身份 我的流程如下