跳至内容

随机API密钥生成器 - 免费安全的32字符密钥

随机API密钥生成器基于浏览器内置的Web Crypto API,在本地生成长度为8到128位的密码学安全随机密钥,可用于接口身份验证、令牌签发等场景。整个生成过程完全在浏览器中完成,密钥内容不会被发送到任何服务器,也不会被保存,保障了密钥生成过程的安全性和私密性。

API密钥生成器

密钥在您的浏览器中使用 Web Crypto API (CSPRNG) 本地生成,使用无偏拒绝抽样。没有任何内容发送到任何服务器。
加载计算器...
📚

文档

随机 API 密钥生成器是一种工具,可创建由字母和数字组成的随机字符串,供两个计算机程序之间用作类似密码的代码。该工具完全在访问者的 Web 浏览器中运行。用户可以选择长度为 8 到 128 个字符的密钥,默认长度设为 32 个字符。

什么是 API 密钥?

API 密钥是一串字符,程序在发送请求时会同时发送它,以证明自己获准使用某项服务。Web 服务器会在响应请求前检查该密钥。与用户名和密码不同,API 密钥通常标识的是应用程序或脚本,而不是个人。

当没有人能够猜出密钥时,密钥的效果最好。使用真正随机性的生成器可以避免人工输入的密钥中出现的模式,例如重复字符或简短、容易记忆的单词。

此生成器的工作原理

该工具从固定的 62 个字符集合中构建每个密钥:26 个大写字母 A–Z、26 个小写字母 a–z,以及 10 个数字 0–9。对于长度为 n 的密钥,它会从该集合中逐个选取 n 个字符。

每个字符都来自浏览器的 Web Crypto API,具体来说是 crypto.getRandomValues()。它是一种密码学安全的随机数生成器(CSPRNG),不同于 JavaScript 的 Math.random(),后者可被预测,不适合用于对安全敏感的值。

要从随机字节(有 256 种可能值)中公平地选出 62 个选项之一,生成器不能简单地使用 byte % 62。由于 256 不能被 62 整除,直接取模会使字符集合开头的几个字符比其余字符略微更容易出现。该工具通过拒绝采样来避免这种偏差:丢弃任何会造成偏差的随机字节,改为重新生成一个。这样,最终密钥中的每个字符在每个位置出现的机会都相等且没有偏差。

如何生成 API 密钥

  1. 输入 8 到 128 个字符之间的密钥长度,或保留默认值 32。
  2. 点击“生成”。密钥会显示在文本框中,整个过程完全在浏览器内完成。
  3. 点击“复制”将密钥复制到剪贴板。某些浏览器首次操作时会请求权限。
  4. 点击“重新生成”可按相同长度生成新密钥,点击“重置”则恢复默认长度。

不会有任何密钥发送到服务器、记录日志或存储。生成过程使用本地 JavaScript 代码,因此在生成期间检查浏览器的网络活动时,不会发现任何发出的请求。

如何计算可能的密钥数量

给定长度能够生成的不同密钥数量遵循一个简单公式:

可能的密钥数 =(字符集大小)^(密钥长度)

对于此工具,字符集大小始终为 62。默认长度为 32 时:

可能的密钥数 = 62³² ≈ 2.27 × 10⁵⁷

这个数量也可以用熵表示,单位为位,公式如下:

熵(位)= 密钥长度 × log₂(字符集大小)

对于长度为 32 个字符的密钥:32 × log₂(62)≈ 32 × 5.95 ≈ 190.5 位。

示例:尝试所有密钥需要多长时间

假设攻击者每秒可以测试十亿(10⁹)个密钥,这对任何现实系统而言都快得不切实际。尝试所有可能的长度为 32 个字符的密钥需要:

2.27 × 10⁵⁷ ÷ 10⁹ = 2.27 × 10⁴⁸ 秒 ≈ 7.2 × 10⁴⁰ 年

作为对比,宇宙的年龄约为 1.4 × 10¹⁰ 年。在这个长度下,逐一尝试所有可能密钥的暴力搜索并不构成实际威胁。较短的密钥会使这个数字迅速变小:8 个字符的密钥只有 62⁸ ≈ 2.18 × 10¹⁴ 种可能的取值,一台高速计算机几天之内就能搜索完。

应用程序为何使用 API 密钥

API 密钥为服务提供了一种简单方式,用来判断哪个应用程序正在发出请求。这一点有几个原因。

身份验证。 服务器可以拒绝未携带有效密钥的请求,从而阻止大多数随意滥用。

使用情况跟踪。 由于每个客户端可以持有不同的密钥,服务可以衡量每个客户端的使用量,并按密钥分别设置速率限制。

撤销。 由于每个密钥彼此独立,某个密钥遭到泄露时,可以单独将其停用,而不会影响其他客户端。

API 密钥比 OAuth 2.0 更容易实现。OAuth 是一种以临时、自动续期的令牌为基础的身份验证标准。OAuth 适用于处理用户个人数据的面向公众服务。API 密钥常用于内部工具、脚本以及服务之间的调用,这些场景可以接受长期有效的凭据。

API 密钥的安全实践

以下几种做法可以降低密钥泄露的风险:

  • **不要把密钥存放在源代码中。**版本控制历史很难彻底清除,而且公开的代码仓库会被持续扫描,查找泄露的凭据。应改为把密钥存放在环境变量或机密管理器中。
  • 定期轮换密钥。 每隔几个月更换一次密钥,可以限制泄露的密钥对攻击者保持有效的时间。
  • 仅授予密钥所需的最低权限。 只能读取数据的密钥不应同时拥有写入或删除数据的权限。
  • 留意异常活动,例如某个密钥发出的请求突然激增。

局限性

该工具不会保留生成过的密钥记录,因此无法保证某个密钥以前从未生成过。两个随机 32 字符密钥匹配的概率约为 1 / (2.5 cm) 2.27 × 10⁵⁷,这个概率对于日常使用来说已经接近于零;但对于数据库主键等需要绝对保证唯一性的系统,应在服务器上将新值与现有值进行比对。

字符集固定由大写字母、小写字母和数字组成。不包含 ! 或 - 等符号,因此密钥可以安全地粘贴到大多数 URL、请求头和配置文件中,无需转义。

常见问题

什么是 API 密钥生成器?

它是一种生成随机字符串的工具,用作软件应用程序之间的身份验证凭据。该工具使用浏览器的密码学安全随机数生成器,创建长度为 8 到 128 个字符的密钥,字符取自 62 个可能字符。

该工具生成的密钥是否足够安全,可用于生产环境?

随机性本身具有密码学安全性。整体安全性还取决于密钥之后的存储和传输方式:绝不要将其提交到源代码管理系统,始终通过 HTTPS 发送,并按固定周期轮换。

应该选择多长的密钥?

默认长度 32 个字符可产生约 2.27 × 10⁵⁷ 种组合,远远超过任何现实中的暴力破解尝试所能搜索的数量。较短的密钥,例如 16 个字符,可能适合低风险的内部工具。过长的密钥增加的保护作用很小,却更难存储和粘贴。

可以设置自定义长度吗?

可以。长度字段接受从 8 到 128 之间的任意整数。字符集本身(A–Z、a–z、0–9)保持不变。

该工具会存储或传输它生成的密钥吗?

不会。每个密钥都由浏览器中的本地 JavaScript 生成。不会有任何内容发送到服务器、记录日志或保存。

API 密钥和 OAuth 令牌有什么区别?

API 密钥是一种长期有效的凭据,除非有人撤销,否则会一直有效。OAuth 令牌会在设定时间后自动过期,并且可以在不需要用户直接参与的情况下刷新。OAuth 适合处理个人数据的公共服务;API 密钥适合更简单的内部或开发用途。

该工具支持哪些浏览器?

任何支持 Web Crypto API 的现代浏览器都可以使用:Chrome 60 及更高版本、Firefox 55 及更高版本、Safari 10 及更高版本、Edge 79 及更高版本,以及 Opera 47 及更高版本。

参考文献

  1. MDN Web Docs(Mozilla)。Crypto: getRandomValues() method。Crypto.getRandomValues()——返回适用于密码学用途的强随机值。
  2. MDN Web Docs(Mozilla)。Math.random()。Math.random()——不提供密码学安全的随机数,不应用于安全用途。
  3. OWASP 基金会。Secrets Management Cheat Sheet。机密管理速查表——说明把 API 密钥硬编码在源代码中的问题,以及集中存储和轮换机密的理由。
  4. NASA Science。Universe overview。宇宙概览——宇宙大约诞生于 13.8 十亿年前。