村长说 -python 管理系统秘钥简单到爆

本贴最后更新于 1370 天前,其中的信息可能已经时移俗易

一、思考❓❔

1.应用系统中你的秘钥是如何处理的呢?

image.png


2.让你揪心的地方?

image.png

本文的主角keyring, 可以解决这些问题。



二、安装keyring??

image.png

# 默认官方源
pip install keyring

# 使用豆瓣源
pip install -i https://pypi.douban.com/simple keyring


三、基本用法????

image.png

1.在py文件中使用

创建base_use.py文件

# 1. 导入keyring模块
import keyring

# 2. 设置密码
# 第一个参数为: 应用名(指定在哪一个应用中来使用)
# 第二个参数为: 用户名
# 第三个参数为: 密码
keyring.set_password('api', 'user1', 'keyou520')

# 3. 获取密码
# 第一个参数为: 应用名(指定在哪一个应用中来使用)
# 第二个参数为: 用户名
my_password = keyring.get_password('api', 'user1')
print(my_password)

2.在命令行中使用

image.png

image.png

image.png


四、高阶用法??

1.生成随机密码并存储

import random
import string

import keyring


class MyPasswd:
    """
    生成随机密码
    """
    app_names = {}

    @classmethod
    def _set_password(cls, servicename, username, sample_content, passwd_num):
        """
        设置密码
        :param servicename: 应用名
        :param username: 用户名
        :param sample_content: 用于生成随机密码的样本字符
        :param passwd_num: 生成密码位数
        :return:
        """
        # 密码的位数必须为正整数
        if isinstance(passwd_num, int) and passwd_num > 0:
            one_list = random.choices(sample_content, k=passwd_num)
            password = ''.join(one_list)

            # 设置密码
            keyring.set_password(servicename, username, password)
            names_list = cls.app_names.get(servicename, [])
            names_list.append(username)
            cls.app_names[servicename] = names_list
        else:
            raise TypeError('密码的位数必须为正整数!')

    @classmethod
    def generate_random_passwd(cls, servicename, username, passwd_num=6):
        """
        生成随机密码, 可以为数字、字母、标点符号
        :param servicename: 应用名
        :param username: 用户名
        :param passwd_num: 密码位数, 为int类型
        :return:
        """
        sample_content = string.ascii_letters + string.digits + string.punctuation
        cls._set_password(servicename, username, sample_content, passwd_num)

    @classmethod
    def generate_digit_passwd(cls, servicename, username, passwd_num=6):
        """
        生成随机的仅数字密码
        :param servicename: 应用名
        :param username: 用户名
        :param passwd_num: 密码位数, 为int类型
        :return:
        """
        sample_content = string.digits
        cls._set_password(servicename, username, sample_content, passwd_num)

    @classmethod
    def generate_letter_passwd(cls, servicename, username, passwd_num=6):
        """
        生成随机的仅字母密码
        :param servicename: 应用名
        :param username: 用户名
        :param passwd_num: 密码位数, 为int类型
        :return:
        """
        sample_content = string.ascii_letters
        cls._set_password(servicename, username, sample_content, passwd_num)

    @classmethod
    def generate_digit_letter_passwd(cls, servicename, username, passwd_num=6):
        """
        生成随机的仅字母和数字密码
        :param servicename: 应用名
        :param username: 用户名
        :param passwd_num: 密码位数, 为int类型
        :return:
        """
        sample_content = string.ascii_letters + string.digits
        cls._set_password(servicename, username, sample_content, passwd_num)

    @staticmethod
    def get_password(servicename, username):
        """
        获取某个应用下指定用户名的密码
        :param servicename: 应用名
        :param username: 用户名
        :return:
        """
        return keyring.get_password(servicename, username)

    @staticmethod
    def delete_password(self, servicename, username):
        """
        删除账号
        :param self:
        :param servicename: 应用名
        :param username: 用户名
        :return:
        """
        return keyring.delete_password(servicename, username)

    @classmethod
    def get_all_servicenames(cls):
        """
        获取所有的应用
        :return: 所有应用组成的列表
        """
        return list(cls.app_names.keys())

    @classmethod
    def get_all_acount_by_servicename(cls, servicename):
        """
        获取指定应用下的所有账户名
        :return: 指定应用下的所有账户名组成的列表
        """
        return cls.app_names.get(servicename)

    @classmethod
    def get_password_by_username(cls, username):
        """
        通过用户名获取密码
        :return: 获取这个用户的所有密码
        """
        one_list = []
        for service_name in cls.get_all_servicenames():
            for name in cls.app_names[service_name]:
                if name == username:
                    try:
                        passwd = keyring.get_password(service_name, name)
                    except Exception:
                        continue
                    one_list.append({
                        service_name: passwd
                    })
        return one_list


if __name__ == '__main__':
    MyPasswd.generate_random_passwd('myapi', 'user1', 10)
    MyPasswd.generate_random_passwd('myapi', 'user2', 20)
    MyPasswd.generate_digit_passwd('apitest', 'user1', 8)
    MyPasswd.generate_digit_passwd('apitest', 'user2', 13)
    MyPasswd.generate_digit_letter_passwd('myapi', 'user3', 15)
    MyPasswd.generate_digit_letter_passwd('apitest', 'user4', 18)
    print(MyPasswd.get_password_by_username('user1'))
    print(MyPasswd.app_names)



六、总结??

image.png

image.png

回帖
请输入回帖内容 ...