当前位置: 首页 > 科技观察

如何优雅地处理程序中的用户名密码等敏感信息

时间:2023-03-15 23:06:37 科技观察

你可能不知道硬编码程序中的敏感信息会带来多大的麻烦。曾经写过一个用Python发送html邮件和附件的程序,分享到网上。里面的收件人没有隐藏,我用我最常用的邮箱。然后,烦恼接踵而至:我不断收到测试电子邮件(垃圾邮件)。问了其中一个发件人才知道有培训机构用这种教学方式,学生跑着用,什么都没改,所以一直收到邮件。与泄露密码相比,这个麻烦还是小的。有人不小心将包含用户名和密码的程序上传到开源网站。为了解决这个问题,需要将敏感信息与程序代码解耦,将敏感信息放在一个文件中,将程序代码放在另一个文件中,避免在发布程序上上传敏感信息。一般来说有两种方式:1.配置文件。您可以使用标准库configparser[1]来解析配置文件。好处是不仅可以读取配置文件,还可以更新配置文件。比如有这样一个example.ini配置文件:[DEFAULT]ServerAliveInterval=45Compression=yesCompressionLevel=9ForwardX11=yes[bitbucket.org]User=hg[topsecret.server.com]Port=50022ForwardX11=no然后就可以读了像这样:config=configparser.ConfigParser()config.read('example.ini')print(config['bitbucket.org']['User'])你也可以使用python文件作为配置文件,最优雅的方式是模仿Django,创建一个默认的settings.py,和用户自定义的settings.py,用户自定义配置可以覆盖默认配置。这种方式非常简单,没有内存负担,就像写Python代码一样。2.环境变量。环境变量(environmentvariables)是指操作系统中用来指定操作系统运行环境的一些参数。比如安装Python时是否需要在Path中加入Python可执行程序,这个Path就是一个环境变量。在Linux或者Mac中,可以这样打印一个环境变量:echo$PATH我们也可以在操作系统的环境变量中写入敏感信息,然后用Python读取:>>>importos>>>os.environ["HOME"]'/Users/aaron'>>>os.getenv("HOME1111",'/home/aaron')'/home/aaron'>>>api_key=os.getenv("SECRET_API_KEY","NotExists")但这有缺点。需要先exportkey=value设置一个环境变量,或者需要去.bashrc、.zshrc等配置文件中添加自己需要的环境变量。如果名称相同,则可能会影响其他程序。到同名的环境变量。毕竟,优雅的方式是在项目目录下新建一个.env环境变量配置文件,写入自己的配置信息,比如.env文件:PROJECT_ID="project_id"API_KEY="api_key"然后使用第三个-partylibrarydotenv:pipinstallpython-dotenv可以像这样读取它:importosfromdotenvimportload_dotenv#load_dotenv将寻找一个.env文件,一旦找到,将其加载到环境变量load_dotenv()PROJECT_ID=os.getenv("PROJECT_ID")API_KEY=os.getenv("API_KEY")并且这种方式不会影响任何其他程序。需要注意的另一件事是将.env添加到您的.gitignore。如果要命名.env文件,也是可以的,比如dev.env,那么可以这样写:fromdotenvimportdotenv_valuesconfig=dotenv_values("dev.env")config.get("PROJECT_ID")甚至多个env文件:importosfromdotenvimportdotenv_valuesconfig={**dotenv_values(".env.shared"),#loadshareddevelopmentvariables**dotenv_values(".env.secret"),#loadsensitivevariables**os.environ,#overrideloadedvalueswithenvironmentvariables}更多用法参考python-dotenv[2]最后,本文介绍了两种避免对敏感信息、配置文件和环境变量进行硬编码的方法。发布程序注意保护敏感信息,添加.gitignore。如果对您有帮助,请点赞、观看、关注和支持。