API 密钥的 IP 白名单

2015年8月19日

电子邮件

1 min read

API 密钥的 IP 白名单

关键要点

    • API keys 是强大的凭证——如果泄露,攻击者可以发送电子邮件,窃取数据或假冒您的品牌。

    • 暴力破解 40 个字符的 hex key 基本上是不可能的;真正的威胁来自于信息暴露(MITM 攻击、不安全的代码库、凭证泄露)。

    • 始终使用 HTTPS 并验证 SSL 证书以防止您的 API keys 被拦截。

    • IP 白名单通过限制 key 的使用至特定的 IP 或 IP 范围来添加重要的保护层。

    • 即使攻击者窃取了您的 API key,除非他们从批准的 IP 连接,否则无法使用。

    • CIDR 支持使得授权整个网络变得容易,而无需列出每个服务器。

    • 避免在代码中嵌入 API keys——请改用环境变量或安全的密钥管理解决方案。

    • 创建多个范围狭窄的 API keys 而不是一个“全能”的 key——每个 key 具有有限权限及其自己的白名单。

    • 对于第三方集成,创建具有受限授权和受限 IP 的专用 keys。

    • 启用账户的 2FA,因为 API keys 只能通过 UI 创建。

    • 定期审查、轮换和退役 keys 以维持强大的运营安全。

Q&A 精华

  • 什么是IP whitelisting?

    这是一个安全功能,限制 API 密钥使用范围到特定的 IP 地址或 IP 范围。

  • 为什么SparkPost/Bird使用API keys进行身份验证?

    API keys 是简单的,广泛采用,并且可以与 REST APIs 和 SMTP 紧密配合。

  • 如果有人偷了我的API密钥会怎么样?

    他们可以代表您发送邮件,下载收件人列表,修改模板,或发送损害您品牌的网络钓鱼/垃圾邮件。

  • API keys可以被暴力破解吗?

    几乎不可能。一个40字符的十六进制字符串有大约 ~1.46e48 种组合——暴力破解所需的时间会比宇宙的年龄还要长。

  • 那么攻击者通常如何获取 API keys?

    中间人攻击(如果SSL没有验证)、在公共GitHub库中暴露的密钥或日志意外泄露密钥。

  • IP 白名单如何帮助?

    即使攻击者偷走了您的密钥,除非他们从批准的IP连接,否则它也不起作用。

  • 我可以将整个网络加入白名单吗?

    是的,通过CIDR表示法——非常适合负载均衡服务器、VPN或静态办公范围。

  • Whitelisting 是否适用于 REST 和 SMTP?

    是的,传入请求的IP必须与您的白名单匹配。

  • 我可以将多少个 IP 或范围列入白名单?

    您需要的数量不限—多个独立IP或区块。

  • 我应该为所有事情使用一个API密钥吗?

    不。为不同的系统、团队或供应商创建单独的密钥。这提高了安全性,并使密钥更容易轮换或撤销。

  • 我应该在哪里存储 API keys?

    使用环境变量——切勿将密钥硬编码到源文件或公共代码库中。

  • 任何其他安全最佳实践?

    始终在您的SparkPost/Bird账户上启用2FA,并为第三方创建专用密钥,给予最低限度的权限和他们自己的白名单。

在像 SparkPost 这样的 API 优先产品中构建身份验证有很多方法,而我们早期选择的是使用 API 密钥。将您的 API 密钥作为原始 Authorization 标头或通过标准 HTTP Basic Auth 注入,使我们的 API 非常易于使用。像这样的 API 密钥是网络服务的常见标准,但这个系统有多安全呢?

在像 SparkPost 这样的 API 优先产品中构建身份验证有很多方法,而我们早期选择的是使用 API 密钥。将您的 API 密钥作为原始 Authorization 标头或通过标准 HTTP Basic Auth 注入,使我们的 API 非常易于使用。像这样的 API 密钥是网络服务的常见标准,但这个系统有多安全呢?

在像 SparkPost 这样的 API 优先产品中构建身份验证有很多方法,而我们早期选择的是使用 API 密钥。将您的 API 密钥作为原始 Authorization 标头或通过标准 HTTP Basic Auth 注入,使我们的 API 非常易于使用。像这样的 API 密钥是网络服务的常见标准,但这个系统有多安全呢?

风险

使用任何网络服务时,如果攻击者获取了您的API密钥,他们可以代表您采取行动,并执行以下操作(在我们的情况下):

  • 通过您的账户免费发送他们的电子邮件

  • 下载您的收件人列表并提供给垃圾邮件发送者(如果他们自己不是垃圾邮件发送者)

  • 编辑您的模板以注入钓鱼链接

  • 代表您发送垃圾邮件或钓鱼邮件

这些结果中的任何一个都可能对您的声誉和您的业务造成严重损害,并且在钓鱼的情况下可能直接损害您的最终用户。这就是为什么确保没有人可以发现您的API密钥是极其重要的。

使用任何网络服务时,如果攻击者获取了您的API密钥,他们可以代表您采取行动,并执行以下操作(在我们的情况下):

  • 通过您的账户免费发送他们的电子邮件

  • 下载您的收件人列表并提供给垃圾邮件发送者(如果他们自己不是垃圾邮件发送者)

  • 编辑您的模板以注入钓鱼链接

  • 代表您发送垃圾邮件或钓鱼邮件

这些结果中的任何一个都可能对您的声誉和您的业务造成严重损害,并且在钓鱼的情况下可能直接损害您的最终用户。这就是为什么确保没有人可以发现您的API密钥是极其重要的。

使用任何网络服务时,如果攻击者获取了您的API密钥,他们可以代表您采取行动,并执行以下操作(在我们的情况下):

  • 通过您的账户免费发送他们的电子邮件

  • 下载您的收件人列表并提供给垃圾邮件发送者(如果他们自己不是垃圾邮件发送者)

  • 编辑您的模板以注入钓鱼链接

  • 代表您发送垃圾邮件或钓鱼邮件

这些结果中的任何一个都可能对您的声誉和您的业务造成严重损害,并且在钓鱼的情况下可能直接损害您的最终用户。这就是为什么确保没有人可以发现您的API密钥是极其重要的。

The odds

我是否听到bruteforce?我们的API密钥是随机生成的40位十六进制字符串。这总共为1.4615e+48个API密钥。如果世界上所有30亿台计算机和智能手机每秒尝试100个API密钥,假设我们的服务器允许这样做,那么尝试所有可能的API密钥将需要超过150,000,000,000,000,000,000,000,000,000年。因此,暴力破解API密钥根本不合理。

那么,有人如何能找到你的API密钥?由于密钥是作为标头传递的,它可以通过中间人攻击读取,因此您应始终确保您的客户端在连接到我们的API时检查SSL证书(这是我们要求API连接使用https的一个主要原因)。此外,如果您不慎使用公共代码库如github,您的API密钥可能会轻易暴露。这不是学术问题:已知有机器人在爬取github以查找API密钥,而且已经有通过该途径的成功攻击。

我是否听到bruteforce?我们的API密钥是随机生成的40位十六进制字符串。这总共为1.4615e+48个API密钥。如果世界上所有30亿台计算机和智能手机每秒尝试100个API密钥,假设我们的服务器允许这样做,那么尝试所有可能的API密钥将需要超过150,000,000,000,000,000,000,000,000,000年。因此,暴力破解API密钥根本不合理。

那么,有人如何能找到你的API密钥?由于密钥是作为标头传递的,它可以通过中间人攻击读取,因此您应始终确保您的客户端在连接到我们的API时检查SSL证书(这是我们要求API连接使用https的一个主要原因)。此外,如果您不慎使用公共代码库如github,您的API密钥可能会轻易暴露。这不是学术问题:已知有机器人在爬取github以查找API密钥,而且已经有通过该途径的成功攻击。

我是否听到bruteforce?我们的API密钥是随机生成的40位十六进制字符串。这总共为1.4615e+48个API密钥。如果世界上所有30亿台计算机和智能手机每秒尝试100个API密钥,假设我们的服务器允许这样做,那么尝试所有可能的API密钥将需要超过150,000,000,000,000,000,000,000,000,000年。因此,暴力破解API密钥根本不合理。

那么,有人如何能找到你的API密钥?由于密钥是作为标头传递的,它可以通过中间人攻击读取,因此您应始终确保您的客户端在连接到我们的API时检查SSL证书(这是我们要求API连接使用https的一个主要原因)。此外,如果您不慎使用公共代码库如github,您的API密钥可能会轻易暴露。这不是学术问题:已知有机器人在爬取github以查找API密钥,而且已经有通过该途径的成功攻击。

IP 白名单拯救

当您创建一个API密钥时,您现在可以指定一个被授权使用该密钥的IP列表。您可以使用CIDR表示法指定多个IP以及IP块,因此您不必单独列出您的服务器。当API密钥被用于REST API或SMTP时,我们将匹配连接的IP与此列表来允许或拒绝访问。

有了这个功能,即使您的API密钥被发现或被盗,只有您的服务器才能使用它。鉴于风险以及设置的简易性,我们强烈建议所有客户使用此功能。

当您创建一个API密钥时,您现在可以指定一个被授权使用该密钥的IP列表。您可以使用CIDR表示法指定多个IP以及IP块,因此您不必单独列出您的服务器。当API密钥被用于REST API或SMTP时,我们将匹配连接的IP与此列表来允许或拒绝访问。

有了这个功能,即使您的API密钥被发现或被盗,只有您的服务器才能使用它。鉴于风险以及设置的简易性,我们强烈建议所有客户使用此功能。

当您创建一个API密钥时,您现在可以指定一个被授权使用该密钥的IP列表。您可以使用CIDR表示法指定多个IP以及IP块,因此您不必单独列出您的服务器。当API密钥被用于REST API或SMTP时,我们将匹配连接的IP与此列表来允许或拒绝访问。

有了这个功能,即使您的API密钥被发现或被盗,只有您的服务器才能使用它。鉴于风险以及设置的简易性,我们强烈建议所有客户使用此功能。

最后的话

关于安全的一些个人建议:

  • 不要在代码中保存你的API密钥。将它们保存在环境变量中有很多好处,比如 Heroku 所做的那样。

  • 你可以创建无限数量的API密钥,为了安全,最好在多个API密钥间分配职责,而不是只使用一个万能密钥。这也允许你为每个密钥设置不同的IP白名单,以实现更好的问题分离。

  • 如果你与第三方合作,不要共享你的API密钥,而是为他们创建一个新的密钥,只授予所需的权限,并与他们的IP绑定。

  • 由于API密钥只能通过UI创建,在你的SparkPost账户上启用双因素身份验证 是必须的,只需花费2分钟。

关于安全的一些个人建议:

  • 不要在代码中保存你的API密钥。将它们保存在环境变量中有很多好处,比如 Heroku 所做的那样。

  • 你可以创建无限数量的API密钥,为了安全,最好在多个API密钥间分配职责,而不是只使用一个万能密钥。这也允许你为每个密钥设置不同的IP白名单,以实现更好的问题分离。

  • 如果你与第三方合作,不要共享你的API密钥,而是为他们创建一个新的密钥,只授予所需的权限,并与他们的IP绑定。

  • 由于API密钥只能通过UI创建,在你的SparkPost账户上启用双因素身份验证 是必须的,只需花费2分钟。

关于安全的一些个人建议:

  • 不要在代码中保存你的API密钥。将它们保存在环境变量中有很多好处,比如 Heroku 所做的那样。

  • 你可以创建无限数量的API密钥,为了安全,最好在多个API密钥间分配职责,而不是只使用一个万能密钥。这也允许你为每个密钥设置不同的IP白名单,以实现更好的问题分离。

  • 如果你与第三方合作,不要共享你的API密钥,而是为他们创建一个新的密钥,只授予所需的权限,并与他们的IP绑定。

  • 由于API密钥只能通过UI创建,在你的SparkPost账户上启用双因素身份验证 是必须的,只需花费2分钟。

其他新闻

阅读更多来自此类别的内容

A person is standing at a desk while typing on a laptop.

完整的AI原生平台,可与您的业务一起扩展。

© 2025 Bird

A person is standing at a desk while typing on a laptop.

完整的AI原生平台,可与您的业务一起扩展。

© 2025 Bird