python管理系統秘鑰真的很簡單


一、思考❓❔

1.應用系統中你的秘鑰是如何處理的呢?

  • 將秘鑰直接寫在程序中
  • 放在環境變量中
  • 隨心處理

2.讓你揪心的地方?

  • 直接寫入程序中不夠安全
  • 環境變量中為加密,還是不夠安全
  • 沒有統一的秘鑰管理中心

本文的主角keyring, 可以解決這些問題。



二、安裝keyring🔨🔨

# 默認官方源
pip install keyring

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


三、基本用法💪🏽💪🏽

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.在命令行中使用


四、高階用法🐙🐙

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)



六、總結💡💡

  • 本文介紹了一種易用的密碼管理方法
  • 提供了一個生成隨機密碼並管理的程序
  • 各位讀者可以在隨機密碼管理程序的基礎上添加新的功能
  • 本文為可優原創,有不足之處,請多指教!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM