在 Python 中管理机密的四种方法
我们生活在一个应用程序用于做任何事情的世界,无论是股票交易还是预订沙龙,但在幕后,连接是使用秘密完成的。必须适当管理机密,例如数据库密码、API 密钥、令牌等,以避免任何泄露。
管理机密的需求对任何组织都至关重要。机密可以通过多种方式泄露,包括通过版本控制系统(切勿对代码中的任何机密进行硬编码)、私人消息、电子邮件和其他通信渠道。如果机密泄露,可能会导致信任、信誉甚至业务的丧失。在某些情况下,泄露的机密也可能导致法律诉讼。这就是为什么制定管理机密的计划如此重要的原因。
在本文中,我们将讨论在 Python 中有效管理机密的四种不同方法。
先决条件
在开始之前,请记住以下几点,以避免以后出现任何问题:
- Python和pip安装在你的机器上。
- 了解 Python 和 CLI。
- Python IDE,如 PyCharm 或 VS Code。
- 对云有基本的了解。
我们将为此设备使用 MacOS。请根据您的操作系统使用这些命令。
在 Python 中管理机密的四种方法
在本节中,我们将讨论在 Python 中管理机密的四种不同方法:
- 从文件
使用 .env 文件
该文件是用于在Python中存储环境变量的文件。环境变量是在 Python 代码之外设置的变量,用于配置 Python 代码。该文件通常用于存储密钥和密码。.env
我们将使用该包来访问文件的内容。若要开始,请首先使用以下命令安装包:python-dotenv.env
$ pip install python-dotenv
创建用于测试目的的文件并粘贴以下机密:.env
API_KEY=test-key
API_SECRET=test-secret
当然,此文件不应提交到您的 git 存储库。否则,即使您删除它,它也将被版本控制和可读。
将此行添加到您的文件中:.gitignore
.env
完成后,创建一个文件并粘贴下面提到的代码片段。在此代码中,我们使用函数从文件加载内容:main.pyload_dotenv().env
from dotenv import load_dotenv
import osload_dotenv()api_key = os.getenv("API_KEY")
api_secret = os.getenv("API_SECRET")print("API_KEY: ", api_key)
print("API_SECRET: ", api_secret)
我们还可以使用该函数,它将机密转换为字典。可以使用以下代码片段访问机密:dotenv_values()
from dotenv import dotenv_valuessecrets = dotenv_values(".env")def main():print(secrets["API_KEY"])print(secrets["API_SECRET"])if __name__ == "__main__":main()
处理大型项目时,您可能会发现需要多个文件。例如,您可能有一个用于本地开发环境的文件和一个用于云开发生产环境的文件。如果您有多个文件,以下代码片段可能会有所帮助:.env.env.env.dev.env
from dotenv import dotenv_valuessecrets = dotenv_values(".env")
local_secrets = dotenv_values(".env.dev")def main():print(secrets["API_KEY"])print(local_secrets["API_SECRET"])if __name__ == "__main__":main()
使用 JSON 文件
若要使机密更有条理,还可以使用 JSON 文件。让我们创建一个文件并将以下机密粘贴到其中:secrets.json
{"db": {"host": "localhost","port": 27017,"name": "test"},"server": {"host": "localhost","port": 3000}
}
与上述相同,请勿提交此文件。
现在我们已经准备好了 JSON 文件,让我们编写一个函数来访问文件中的机密:
import jsondef get_value_from_json(json_file, key, sub_key):try:with open(json_file) as f:data = json.load(f)return data[key][sub_key]except Exception as e:print("Error: ", e)print(get_value_from_json("secrets.json", "db", "host")) # prints localhost
- 使用环境变量 环境变量是由操作系统或特定用户设置的变量,程序使用它来确定各种设置。我们可以使用这些变量来存储我们的秘密,然后在我们的程序中访问它们。您可以使用以下语法在 macOS 或 Linux 计算机中创建环境变量:
$ export variable_name=value
$ export API_KEY_TEST=dummykey
在 Windows 计算机上,可以使用 GUI 添加环境变量或使用以下命令添加变量:
$ setx [variable_name] “[value]”
可以使用操作系统包访问操作系统环境变量。下面提到的是示例代码:
import os# Get the secret key from the environment
secret_key = os.environ.get('api_key_test')
print(secret_key) // prints dummykey
命令行中的机密也应特别小心地处理。
- 使用云机密管理器 大多数云服务提供商都提供内置的密钥管理器,可用于跨云基础架构创建和使用密钥。以下云提供商提供的秘密管理器:
- AWS 密钥管理器
- Secret Manager (By Google Cloud)
- Azure Key Vault
AWS Secrets Manager 在整个行业中广泛使用。让我们编写一个函数来使用 Boto3 在 AWS 中创建和访问密钥:
import boto3def fetch_secret_from_aws(secret_name):try:session = boto3.session.Session()client = session.client(service_name='secretsmanager', region_name='us-east-1')get_secret_value_response = client.get_secret_value(SecretId=secret_name)return get_secret_value_response['SecretString']except Exception as e:print(e)return Nonedef create_secret_in_aws(secret_name, secret_value):try:session = boto3.session.Session()client = session.client(service_name='secretsmanager', region_name='us-east-1')client.create_secret(Name=secret_name, SecretString=secret_value)return Trueexcept Exception as e:print(e)return False
- 使用 KMS KMS 是用于管理加密密钥的密钥管理系统。它通常在组织中用于集中管理和保护密钥。KMS 可用于生成、存储和分发密钥。它还可用于吊销密钥和监视密钥使用情况。
KMS 是集中管理应用程序和服务使用的密钥的便捷方法,有助于确保只有授权用户才能访问这些密钥。
Hashicorp Vault 是市场上最好的开源 KMS 之一,它提供了许多功能和优势,包括跨多个环境管理密钥和密钥的能力、强大的安全控制和良好的可扩展性。
让我们编写一个函数来读取机密并将其写入保管库中的特定路径。
注意:请确保您已安装 hvac(适用于 Vault 的 Python 客户端)并设置了 Hashicorp Vault:
import hvacdef read_secret_from_vault(secret_path, token, secret_name):try:client = hvac.Client(url='<http://localhost:8200>',token=token,)read_response = client.secrets.kv.read_secret_version(path=secret_path)return read_response['data']['data'][secret_name]except Exception as e:print(e)return Nonedef write_secret_to_vault(secret_path, token, secret_name, secret_value):try:client = hvac.Client(url='<http://localhost:8200>',token=token,)create_response = client.secrets.kv.v2.create_or_update_secret(path=secret_path,secret={secret_name: secret_value},)return create_responseexcept Exception as e:print(e)return None
总结
管理机密是应用程序开发的重要组成部分。当开发人员将明文机密硬编码到他们的应用程序中时,会产生潜在的安全漏洞。如果发现敏感数据,攻击者可以使用这些机密访问这些数据。
此处建议的方法的另一种替代方法是将机密签入源代码,并与加密的团队共享。如果您学习如何利用Mozilla SOPS等工具,这可能是一个非常灵活的解决方案。
相关文章:
在 Python 中管理机密的四种方法
我们生活在一个应用程序用于做任何事情的世界,无论是股票交易还是预订沙龙,但在幕后,连接是使用秘密完成的。必须适当管理机密,例如数据库密码、API 密钥、令牌等,以避免任何泄露。 管理机密的需求对任何组织都至关重…...
全国青少年信息素养大赛Python编程挑战赛初赛试题说明
Python 编程挑战赛初赛采用线上考试比赛形式,分为小学组和初中组。不同组别的考核重难点略有不同,考核内容主要是 Python 基础知识,共 30 题,均为单选题,具体考核如下: 小学组考核内容主要是 Python 基础知识,包括输入输出,变量,条件结构,计次循环和无限循环,海龟库…...

无需魔法打开即用的 AI 工具集锦
作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...

如何进行SEO站内优化,让你的网站更易被搜索引擎收录
我们了解了 SEO 的流程,知道了哪些元素对 SEO 的效果会产生关键影响,接下来,我们就该正式开始动手,打造一个让搜索引擎“爱不释手”的网站。 为了方便理解与记忆,我们将网站划分为几个模块,告诉你优化网站…...

组件内部watch后切换数据报错Error in callback for watcher “xxxx“
报错信息: 报错代码: 百度了一下是因为这里写了箭头函数,导致this指向为父级作用域上下文,不是vue实例导致 修改为: progressData: {handler: function(newValue, oldValue) {this.setChartData(newValue)},deep: …...

VMware ESXi 7.0 U3l macOS Unlocker OEM BIOS (标准版和厂商定制版)
VMware ESXi 7.0 U3l macOS Unlocker & OEM BIOS (标准版和厂商定制版) 提供标准版和 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科) 定制版镜像 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-oem/,查看最新版…...

华为阿里版ChatGPT横空出世,谁的成效更好呢?
“你训练的大模型涌现了吗?”“还没有。好难受。”一时间成为了最近AI赛道玩家的一个爆热梗。 不管承不承认,相信每个玩家都不愿意输掉这场激烈的竞争。自百度成为国内“第一个吃螃蟹的人”后,又有两大中国科技巨头做好了准备——华为和阿里…...
【云原生之Docker实战】使用docker部署kooteam在线团队协作工具
【云原生之Docker实战】使用docker部署kooteam在线团队协作工具 一、kooteam介绍1.kooteam介绍2.kooteam的技术选型二、检查本地docker环境1.检查Docker版本2.检查Docker状态三、下载kooteam镜像四、部署kooteam文档管理系统1.创建安装目录2.创建mysql数据库3.新建kooteam数据库…...
ITSS认证是什么认证,itss资质认证
一、ITSS是什么 ITSS根据英文翻译信息技术服务标准(InformationTechnologyServiceStandards,简称ITSS),它既是一套成体系和综合配套的标准库,又是一套选择和提供IT服务的方法学,对企业IT服务而言࿰…...

FTP-----局域网内部远程桌面
此文包含详细的图文教程。有疑问评论区留言。博主第一时间解决。 目录 一、被远程桌面的电脑 1.开启远程权限 2.添加账户,有本地账户跳过这步 3.帐号隶属于 远程桌面 4.帐号隶属于 本地用户组 二、本地电脑连接远程桌面 前提条件: 1.两台电脑在…...

Learning C++ No.18【STL No.8】
引言: 北京时间:2023/3/18/21:47,周末,不摆烂,但是欠钱终于还是遭报应了,导致坐牢7小时(上午3.5,下午3.5),难受,充分意识到行哥是那么的和蔼可亲…...

pytorch搭建ResNet50实现鸟类识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍦 参考文章地址: 365天深度学习训练营-第J1周:ResNet-50算法实战与解析 🍖 作者:K同学啊 理论知识储备 深度残差网络ResNet(dee…...

Node.js -- npm与包
1.包 Node.js中的第三方模块又叫做包 就像电脑和计算机指的是相同的东西,第三方模块和包指的是同一概念,只不过叫法不同。 包的来源: 包是由第三方或者个人团队开发出来的,免费供个人使用。 国外有一家IT 公司,叫做n…...

二 、Locust自定义用户(场景)
二 、自定义用户(场景) 一个用户类代表了你系统中的一种用户/场景。当你做一个测试运行时,你指定你想模拟的并发用户的数量,Locust将为每个用户创建一个实例。你可以给这些类/实例添加任何你喜欢的属性,但有一些属性对…...

1~3年的测试工程师薪资陷入了瓶颈期,如何突破自己实现涨薪?
对于技术人员而言,职业规划一般分为两个方向:做技术、做管理。进入软件测试行业的新人都会从最基础的执行开始,然后是基本的功能测试。 随后大家会根据个人职业发展来进一步细化,有的走管理路线,成为主管、经理、项目…...
springboot项目前端ajax 07进阶优化,使用jQuery的ajax
使用官网https://jquery.com/ 在下载那里,选择Download the compressed, production jQuery 3.6.4(版本不一样),而后在打开的网页中,选择另存为,就下载好了js文件。 > function doAjax(){ …...
东数西存场景的探索与实践
“东数西算”是通过构建数据中心、云计算、大数据一体化的新型算力网络体系,将东部算力需求有序引导到西部,对优化数据中心建设布局,提升国家整体算力水平,促进绿色发展,扩大有效投资,具有重要意义。 在实…...
[图神经网络]PyTorch简单实现一个GCN
Pytorch自带一个PyG的图神经网络库,和构建卷积神经网络类似。不同于卷积神经网络仅需重构__init__( )和forward( )两个函数,PyTorch必须额外重构propagate( )和message( )函数。 一、环境构建 ①安装torch_geometric包。 pip install torch_geometric …...

Elasticsearch(黑马)
初识elasticsearch . 安装elasticsearch 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的…...
oracle数据库调整字段类型
oracle数据库更改字段类型比较墨迹,因为如果该字段有值,是不允许直接更改字段类型的。另外oralce不支持在指定的某个字段后面新增一个字段,但是mysql数据可以向指定的字段后面新增一个字段。 mysql向指定字段后面新增一个字段: al…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...

如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...