RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 764330
Accepted
Twiss
Twiss
Asked:2020-12-28 16:00:35 +0000 UTC2020-12-28 16:00:35 +0000 UTC 2020-12-28 16:00:35 +0000 UTC

在 Python 代码中隐藏用户名和密码

  • 772

如何在代码本身中使用密码加密登录?好吧,或者以其他方式使其他人无法获得它们,因为代码本身必须是开放的并且可供其他人查看。

conn = pymysql.connect(
    host="xxc.ru",
    port=3306,
    user="user",
    password="password",
    db="test",
    charset='utf8'
)

在这种情况下使用凯撒密码是否有意义,就像问题一样?

python
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    andreymal
    2020-12-28T17:20:18Z2020-12-28T17:20:18Z

    像我这样聪明的学生很快就能破解凯撒的密码。

    分开飞,分开炸肉排:只要不要在代码里面写密码,问题会自己解决的。此外,要连接到其他数据库,您不需要编辑代码,这增加了便利性。但是在哪里写密码 - 已经有很多选择了。

    环境变量

    在任何“成人”操作系统中,都有一些全局变量称为环境变量(environment variables,environment variables)。您可以将密码放在那里,然后在 python 中读取这些变量。如何更改环境变量取决于特定的操作系统(您可以阅读 Wikipedia 上的详细信息),在 Python 代码中,阅读它们可能如下所示:

    import os, pymysql
    conn = pymysql.connect(
        host="xxc.ru",
        user=os.getenv('MYSQL_USER'),
        password=os.getenv('MYSQL_PASSWORD'),
        # ...
    )
    

    在此示例中,登录名是从环境变量中读取的,密码是从 中读取MYSQL_USER的MYSQL_PASSWORD。

    纯文本文件

    本质很简单:我们在任何文本编辑器中编写密码,将其保存到文本文件中,然后在 python 中读取该文件。

    with open('mysql_user.txt', 'r', encoding='utf-8-sig') as fp:
        mysql_user = fp.read().rstrip()
    
    with open('mysql_password.txt', 'r', encoding='utf-8-sig') as fp:
        mysql_password = fp.read().rstrip()
    
    conn = pymysql.connect(
        host="xxc.ru",
        user=mysql_user,
        password=mysql_password,
        # ...
    )
    

    在此示例中,登录名和密码从文件中读取mysql_user.txt并mysql_password.txt位于当前目录中。

    稍微解释一下为什么我以这种方式读取文件:

    • 使用后明确关闭打开的文件是一种很好的方式。with这对;来说非常方便。

    • UTF-8 是世界上最好的编码,所以我把它写下来,并建议你随时随地使用它。但有一个细微差别:Windows 记事本在文本文件的开头添加了BOM,为了通过 python 正确处理,我规定了编码utf-8-sig,而不仅仅是utf-8;

    • 一些文本编辑器在文件末尾添加了一个换行符,所以我用 删除它rstrip(),以免干扰。

    完整的配置文件

    您很可能不仅希望将登录名和密码与代码分开存储,那么为什么不拥有一个完整的配置呢?例如,您可以创建这样的文件config.ini:

    [mysql]
    user = логин
    password = пароль
    

    然后在python中解析它:

    import configparser, pymysql
    config = configparser.ConfigParser()
    config.read('config.ini', encoding='utf-8-sig')
    
    conn = pymysql.connect(
        host="xxc.ru",
        user=config.get('mysql', 'user'),
        password=config.get('mysql', 'password'),
        # ...
    )
    

    ConfigParser- 非常强大和多才多艺的东西;我建议至少阅读文档以进行一般开发。

    如果您想在某个 GitHub 上公开发布您的代码,请不要忘记将带有所有密码的文件添加到.gitignore.

    带变量的 Python 模块

    例如,您可以创建一个 Python 文件,local_settings.py并在其中写入带有登录名和密码的变量:

    MYSQL_USER = 'Вася'
    MYSQL_PASSWORD = '123456'
    

    然后在导入后访问它们:

    import local_settings as settings
    
    conn = pymysql.connect(
        host="xxc.ru",
        user=settings.MYSQL_USER,
        password=settings.MYSQL_PASSWORD,
        # ...
    )
    

    由于它local_settings.py是一个成熟的 Python 文件,您可以在其中执行一些任意代码,这与文本文件相比增加了灵活性,但同时开辟了新的方法,所以要小心。

    必须找到该文件,以便 Python 可以找到并导入它。它可能不会在所有环境中从当前目录导入文件,如果上面示例中的简单导入不适合您,您可能需要设置环境变量PYTHONPATH=.或将当前目录添加到sys.path.

    顺便说一句,所有与文件相关的方法都可以与环境变量结合使用。底线是这样的:我们在环境变量中写入要读取的内容,然后 Python 代码读取那里指定的文件(或导入指定的模块):

    SETTINGS_MODULE=my_mysql_settings

    import os, importlib
    # Это значение по умолчанию на случай, если переменной окружения не будет
    os.environ.setdefault('SETTINGS_MODULE', 'local_settings')
    
    # Импортируем модуль, указанный в переменной окружения
    settings = importlib.import_module(os.getenv('SETTINGS_MODULE'))
    
    # Остальное как обычно
    conn = pymysql.connect(
        host="xxc.ru",
        user=settings.MYSQL_USER,
        password=settings.MYSQL_PASSWORD,
        # ...
    )
    

    这样,您可以拥有多个配置文件并使用环境变量在它们之间切换。例如,在流行的 Django web 框架中使用了类似的方法(比我展示的更复杂,但类似);有这样一个环境变量叫做DJANGO_SETTINGS_MODULE.

    根本不要存储任何东西,每次都在控制台中请求

    每次都输入数据库密码不是很方便,但还是一种选择。同时,使用getpass输入的文本不会显示在控制台中(即使没有星号),所以没有人会知道你在那里输入了什么密码。

    import getpass, pymysql
    
    mysql_user = getpass.getpass('MySQL user> ')
    mysql_password = getpass.getpass('MySQL password> ')
    
    conn = pymysql.connect(
        host="xxc.ru",
        user=mysql_user,
        password=mysql_password,
        # ...
    )
    
    • 20
  2. Vasyl Kolomiets
    2020-12-28T16:40:51Z2020-12-28T16:40:51Z

    如果在您机器上的 Windows 上,那么您可以创建两个环境变量并将它们存储在其中。并在程序中,显式读取带有名称的环境变量,例如USERPYTHON PASSWORDSQL并使用它们的值,从而将您的数据隐藏在学生的眼中))

    • 8
  3. Vadim Toptunov
    2020-12-29T20:32:07Z2020-12-29T20:32:07Z

    要么使用存储在其他人的抓取笔无法获取的配置文件,要么对其进行加密,但要认真对待,这样在没有密钥的情况下(例如通过 DES)解密将是漫长而乏味的。

    • 1
  4. Hose Barrera
    2020-03-25T03:42:00Z2020-03-25T03:42:00Z
    import sys
    import keyring
    import getpass
    my_server = '192.168.0.1'
    def windows_credential():
        # look there: cmd -> control userpasswords2 -> Advanced -> Manage passwd -> Windows Credential
        passwd = getpass.getpass(prompt='Please input password for account: ')
        keyring.set_password(my_server, getpass.getuser(), passwd)
        print('The Windows credential was sucessfully created for host: {} and user: {}'.format(my_server, getpass.getuser()))
    def get_passwd():
        passwd = keyring.get_password(my_server, getpass.getuser())
        if passwd is None:
            print('Please create windows credential for host')
            sys.exit(1)
        return passwd
    windows_credential()
    print(get_passwd())
    

    通常加密的密码存储在数据库中,如果您不打算使用数据库,则在本地存储凭据管理器中 - 存储会为您加密所有内容。密钥环也适用于 linux 凭据。 在此处输入图像描述

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5