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

什么是密钥?

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

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 ,调用的接口为云服务器的查询实例列表:

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 这两个环境变量,例如:

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. 将密钥放在代码的一个特殊的文件中,使用时再去引用。这会让你分享部分代码时保证安全,但是有些粗心的开发者会把整个项目的代码放在网上,这时候就很危险了。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云端架构

【云端架构】常见电脑开放端口及含义

说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址...

64070
来自专栏知晓程序

如何搭建微信小程序 HTTPS 服务器?只需三个步骤

1.2K20
来自专栏葡萄城控件技术团队

网站HTTP升级HTTPS完全配置手册

今天,所有使用Google Chrome稳定版的用户迎来了v68正式版首个版本的发布,详细版本号为v68.0.3440.75,上一个正式版v67.0.3396....

47300
来自专栏BestSDK

3秒钟,用python破解加密PDF|附工具地址

文中将介绍如果利用开源工具、python代码等秒破加密的pdf文件。 ? 过程分析 因为pdf文件加密的密码是随机的,而且密码不长。首先,我们需要指导pdf的加...

89550
来自专栏张戈的专栏

分享一个SSL证书在线转换工具,以及IIS7环境下开通https的方法

衔接上一篇文章,提到了公司只能提供 Nginx 下的 SSL 证书,却要在 IIS 里面开启 https 这个问题。本来想去申请上次分享的沃通免费 SSL 证书...

81380
来自专栏程序员的碎碎念

php实现登录短信验证

今天benny要跟大家说这个其实很简单,就是借用某一个平台的短信api接口实现短信验证,说简单呢,那是因为他的官网:http://www.ucpaas....

99990
来自专栏FreeBuf

CVE-2017-3085:Adobe Flash泄漏Windows用户凭证

早前我写了一篇文章讲述Flash沙盒逃逸漏洞最终导致Flash Player使用了十年之久的本地安全沙盒项目破产。从之前爆出的这个漏洞就可以看出输入验证的重要性...

31460
来自专栏派森公园

cookie和token

56750
来自专栏企鹅号快讯

Tomcat的设置HTTP页面自动跳转到HTTPS

HTTP转换到HTTPS常见的解决方案是部署SSL证书来升级。只有正确部署了SSL证书才能使用安全的HTTPS。但有时候,客户端使用HTTP进行访问时,HTTP...

41150
来自专栏北京马哥教育

吐血整理所有常用端口,不全你来打我!

作者:ADreamClusive 来源: http://blog.csdn.net/u013943420/article/details/65938696 大家...

450130

扫码关注云+社区

领取腾讯云代金券