腾讯云 API 最佳实践:保护你的密钥

2018-07-18 23:56:45 浏览数 (1)

什么是密钥?

密钥又称密钥对,就是 SecretId 和 SecretKey,他们长得像这样:

代码语言:txt复制
SecretId: AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE
SecretKey: Gu5t9xGARNpq86cd98joQYCN3EXAMPLE

其中 SecretKey 尤其重要,相当于密码, SecretId 相当于你的帐号。

密钥的作用?

使用腾讯云 API 时,你需要用密钥来签名你的 API 请求。腾讯云接收到你的请求后,会比对你的签名串和实际请求参数。如果通过了验证,那请求会被认为合法的,继而发给后台服务继续执行。

密钥在权限上等同于你的帐号和密码。你登录腾讯云控制台时是使用帐号和密码,但是当你点击控制台各种按钮时,控制台实际是用密钥对来签名 API 请求。

密钥的有效期是永久的,这也是为什么你需要将其妥善保管的原因之一。在一些高度敏感的业务中,你甚至需要使用永久密钥去生成临时密钥去发起 API 请求。临时密钥是有有效期的,过期自动就失效了。对于普通开发者,要使用到它的场景很少,以后有机会再另行介绍。

你可以在腾讯云控制台云 API 密钥界面 https://console.cloud.tencent.com/cam/capi 管理你的密钥。你会发现你甚至无法直接看到密钥,只能通过短信获得短暂的解锁,可见它的重要性。另外,一个帐号可以生成多个密钥,当你觉得密钥可能已经被泄漏时,你可以删除旧的密钥,创建新的密钥继续使用腾讯云的服务。

密钥为何会泄漏?

密钥有各种可能被泄漏,但是通常发生在不当的代码共享场景里。许多开发者直接把密钥写在代码中,当代码遇到问题时,又喜欢把代码贴在网上寻求帮助,或者在腾讯云的工单系统里提单咨询时直接贴上源码。对于敏感的密钥又不进行打码或者删除处理,从而造成密钥的泄漏。泄漏密钥会让有恶意的人获得和你相同的权限,可能对财产造成无法挽回的损失。

如何保护你的密钥

那么在你的代码中,你该如何保护你的密钥呢?

答案是:

把你的密钥隐藏在环境变量中

把你的密钥隐藏在环境变量中

把你的密钥隐藏在环境变量中

我们推荐开发者使用腾讯云 SDK 调用 API 。下面以 3.0 Python SDK https://github.com/TencentCloud/tencentcloud-sdk-python 为例简单介绍下,操作系统为 Ubuntu 16.04 ,调用的接口为云服务器的查询实例列表:

代码语言:txt复制
import os

from tencentcloud.common import credential
from tencentcloud.cvm.v20170312 import cvm_client, models

try:
    cred = credential.Credential(
        os.environ.get("TENCENTCLOUD_SECRET_ID"),
        os.environ.get("TENCENTCLOUD_SECRET_KEY"))
    client = cvm_client.CvmClient(cred, "ap-guangzhou")
    req = models.DescribeInstancesRequest()
    resp = client.DescribeInstances(req)
    print(resp)
except Exception as err:
    print(err)

看到了吗?我分享了一个完整的代码,但是没有泄漏我的密钥。我把密钥放在了环境变量里,在代码里读取了密钥的环境变量,这样这份代码可以部署在任意的环境中,只要我在那个环境下设置了环境变量,代码就可以运行。

为了代码能够在你的环境中运行,你需要先在 Shell 环境下导出 TENCENTCLOUD_SECRET_IDTENCENTCLOUD_SECRET_KEY 这两个环境变量,例如:

代码语言:txt复制
export TENCENTCLOUD_SECRET_ID=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE
export TENCENTCLOUD_SECRET_KEY=Gu5t9xGARNpq86cd98joQYCN3EXAMPLE

注意,这里要把这两个示例的值替换为你的真实的密钥值。如果你觉得每次登录 Shell 环境都要导出很麻烦,可以将其配置在 ~/.bashrc 文件中,下次在登录 Shell 环境时,就会自动导出这两个环境变量了。

经过这样的保护措施,除非别人直接接触到你的环境,否则就无法获得你的密钥,至少无法获得你的 SecretKey 。

此外,你的代码也获得了稳定性。如果你怀疑密钥已被泄露,要更换你的密钥,你不需要更新代码,重新编译部署,只需要在环境变量中直接修改就可以了。

Windows 环境?

Linux 和 Mac 环境都可以用 export 来导出环境变量,但是在 Mac 环境下 ~/.bashrc 文件可能不会起作用,你需要把环境变量的设置放在 ~/.bash_profile 文件中,或者采取其他更好的方式,只要能导出环境变量即可。

Windows 下你同样可以导出环境变量,不同的操作系统版本可能方式略有不同,但是一般是:我的电脑 =》属性 =》 高级系统设置 =》 环境变量 =》 系统变量 =》 新建。可以网上搜索下图文介绍,此文不做赘述了。

其他方式?

除了把密钥放在环境变量中,还有其他方式保护密钥吗?有的,但是未必很友好:

  1. 将密钥放在配置文件中,代码读取配置文件。这是另一种通行的做法,特别是当你在写一个正式的服务时。不过你的代码就要写死配置文件的路径了,在 Windows 和 Mac 环境下,这些路径很有可能会不同。
  2. 将密钥放在代码的一个特殊的文件中,使用时再去引用。这会让你分享部分代码时保证安全,但是有些粗心的开发者会把整个项目的代码放在网上,这时候就很危险了。

0 人点赞