Python工具箱系列(十五)

前文讲述加解密时,直接将密钥写在了python源代码中,这肯定不是什么好的手法。应该将这类与代码加功效无关的信息保存到配置中,随时可以需要进行修改。从大的角度来看,配置无非就是以下方式:

  • 保存到配置文件中,格式可以是txt/csv/ini/xml/yaml/json/其它特殊格式等;
  • 保存到数据库中,数据库可以是本地的,也可以是远程的;
  • 特殊情况下,配置信息先加密再保存。

保存到文件中的主要问题有:

  • 没有格式的例如txt文件易读但也容易搞坏,从而使配置内容无法正确解析;
  • 有格式的例如xml/yaml/json需要安装相关的包,需要写代码读写,其实也不轻松;
  • 文件系统会让路径问题一直存在,需要解决找到配置文件的问题。

保存到数据库的主要问题有:

  • 数据库管理系统本身需要架构,如果是轻量级配置,重型的数据库管理系统MYSQL/REDIS/SQLSERVER等性价比不高;
  • 数据库的使用需要掌握SQL语言,如果是轻量级配置也不合算。

在本系统中,尽量避免重型数据库的安装,使用简单的方式来保存配置信息。推荐使用以下方式:

  • 借助于标准库configparser来访问ini文件;
  • 使用标准库dbm访问键值数据库。

configparser访问配置信息

使用历史悠久的INI文件格式来描述,文件内容如下所示:

cat .\aeshandler.ini 
[AES]
key=stayhungrystayfoolish

可以看出,配置文件由[]定义了所谓的section(节)。节的名字随意,这里定义为'AES'。随后在节里定义具体的内容。这里将密钥保存在'key'这个名字里。

使用python获得配置的代码如下:

from configparser import ConfigParser

def readconfig():
    """
    使用标准库读取配置文件

    Returns:
        str: 配置文件中保存的密钥
    """
    config = ConfigParser()
    config.read('aeshandler.ini',encoding='utf-8')
    return config.get('AES','key')

if __name__ == '__main__':

    key = readconfig()
    realkey = key[:16].encode('utf-8')
    print(f'realkey is {realkey}')

功能性的代码同前文,为了节省空间不再复制。通过configparser读取配置文件确实非常简单易行,远比操作数据库甚至比普通的文件读写还简易。

使用dbm来读写配置

DBM数据库是UNIX的键-值对数据库。能够保存python中字典类型的信息。以下代码实现类似的功能:

import dbm

def writeconfig(dbmfilename, key):
    """
    向DBM库写配置的密钥值

    Args:
        dbmfilename (str): dbm数据库名称
        key (str): 写入的密钥值
    """
    with dbm.open(dbmfilename, 'n') as db:
        db['key'] = key


def readconfig(dbfilename):
    """
    从DBM库中读取密钥

    Args:
        dbfilename (str): 数据库名称

    Returns:
        str: 配置文件中保存的密钥
    """
    with dbm.open(dbfilename, 'r') as db:
        return db['key']


if __name__ == '__main__':
    writeconfig("aeshandler.dbm", "talkischeapshowyourcode")
    key = readconfig("aeshandler.dbm")
    realkey = key[:16]
    print(f'realkey is {realkey}')

实现类似的功能,但代码量更小,确实很方便的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python工具箱系列(十五) - Python技术站

(0)
上一篇 2023年4月2日 下午4:23
下一篇 2023年4月2日 下午4:24

相关文章

  • Python工具箱系列(十八)

    非对称加解密应用广泛,它的存在是致力于解决密钥通过公共信道传输这一经典难题。对称加密有一个天然的缺点,就是加密方和解密方都要持有同样的密钥,而这个密钥在传递过程中有可能会被截获,从而使加解密失效。难不成还要为密钥的传输再做一次加密?这样不就陷入了死循环?或许有人在想,密钥即使被盗取,不还有加密算法保证信息安全吗?但任何算法最终都会被破译,所以不能依赖算法的复…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(六)

    相比较于windows下安装python,在Linux下安装python实际上是一个非常困难的选择。首先要解决的就是选择哪个发行版本的问题。Linux的内核掌握在技术团队中,但是Linux发行版本则掌握在不同的公司手中。不同的公司出于不同的考虑,在Linux内核的基础上,打包了不同的应用程序,安装了不同的包管理器,实现了不同的发布策略,这就导致了数以百计的发…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(三十一)

    Neo4j是一个高性能的开源的,使用Java语言实现的NoSQL图数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。现实中很多数据都是用图来表达的,比如社交…

    python 2023年5月11日
    00
  • Python工具箱系列(十二)

    在计算机世界里只有二进制。唯有人类才会对数据进行类型与价值判断。例如,认为某些文件是文本文件、是WORD/EXCEL文件或者是图片。对于加密算法来说也是一样的,加解密算法处理的只是字节流,根本不关心所谓的文件类型。对于文件来说,存在以下基本操作: ◆ open ◆ close ◆ read ◆ write ◆ delete 在Unix世界中,更是将文件这一概…

    2023年4月2日
    00
  • Python工具箱系列(十七)

    很多软件工程师都认为MD5是一种加密算法,然而这种观点是不对的。作为一个 1992 年第一次被公开的算法,到今天为止已经被发现了一些致命的漏洞。本文讨论MD5在密码保存方面的一些问题。 假设下面一个场景:   软件产品让用户输入用户名与口令,随即使用MD5算法将口令(明文)转变成为摘要值。 用户登录时,用户输入的口令,也使用MD5进行计算,然后与存储的MD5…

    2023年4月2日
    00
  • Python工具箱系列(八)

    前面我们提到过,有以下工具都可以开发Python代码: 直接使用Python解释器。运行Python就可以得到一个交互式命令行界面,可以简单的测试代码。作为Python入门,写代码不超过10行,完全可用。如果想开发大型代码,这个真心很难用。 使用IPython,也是命令行界面,但内置非常方便的各种宏与功能。比单纯的Python交互界面强太多。在某些情况下,例…

    2023年4月2日
    00
  • Python工具箱系列(二十)

    数据库操作应是所有合格程序员的基本功,写的一手好SQL对于数据分析师而言更是安身立命之本。大部分软件开发人员使用的数据库都是MySql/MariaDB,毕竟LAMP(linux+apache+mysql+php)曾经风靡一时。但开发人员真正的瑞士小军刀却是SQLite,它是世界上装机量第一的嵌入式数据库。 SQLite最初的构思是在一条军舰上进行的。当时在通…

    2023年4月2日
    00
  • Python工具箱系列(二十三)

    基于游标得操作 游标是数据库操作的相对底层的能力。简单的操作如下: import mysql.connector import random host = ‘localhost’ user = ‘root’ password = ‘8848is8848’ dbname = ‘demodb’ def fakedata(maxtimes): # 连接数据库 de…

    2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部