os模块

os模块是与操作系统交互的一个接口​

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<em>#和文件夹相关
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
# 和文件相关
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息
# 和操作系统差异相关
os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
# 和执行系统命令相关
os.system("bash command")  运行shell命令,直接显示
os.popen("bash command).read()  运行shell命令,获取执行结果
os.environ  获取系统环境变量
#path系列,和路径相关
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值,即os.path.split(path)的第二个元素。
os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)  如果path是绝对路径,返回True
os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小<br></em>

?
1
2
3
4
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')

注意:os.stat('path/filename') 获取文件/目录信息 的结构说明

?
1
2
3
4
5
6
7
8
9
10
11
stat 结构:
st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。 

回到顶部

sys模块

sys模块是与python解释器交互的一个接口

?
1
2
3
4
5
sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version        获取Python解释程序的版本信息
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       返回操作系统平台名称

回到顶部

hashlib模块

算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

?
1
2
3
4
5
6
7
import hashlib
md5 = hashlib.md5()
md5.update('how'.encode('utf-8'))
print(md5.hexdigest())
结果:db88a0257c220dbfdd2e40f6152d6a8d

如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
import hashlib
md5 = hashlib.md5()
md5.update('how你好啊,我不好'.encode('utf-8'))
print(md5.hexdigest())
结果:3bfa4bfb7b59a59f27c24ebdd89cd13c
import hashlib
md5 = hashlib.md5()
md5.update('how'.encode('utf-8'))
md5.update('你好啊,我不好'.encode('utf-8'))
print(md5.hexdigest())
结果:3bfa4bfb7b59a59f27c24ebdd89cd13c

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

?
1
2
3
4
5
6
7
8
import hashlib
sha1 = hashlib.sha1()
sha1.update('how to use sha1 in'.encode('utf-8'))
sha1.update('python hashlib?'.encode('utf-8'))
print(sha1.hexdigest())
结果:86e1eae2a08c152d39b55baed085c71a0cc9d10b

SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。

SHA1的安全系数比MD5还要高一些,而且摘要的长度要比MD5长一些.

比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

摘要算法应用 任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中:

?
1
2
3
4
5
name    | password
--------+----------
michael | 123456
bob     | abc999
alice   | alice2008

如果以明文保存用户口令,数据库泄露,所有用户的口令就落入黑客的手里就......

此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:

?
1
2
3
4
5
username | password
---------+---------------------------------
michael  | e10adc3949ba59abbe56e057f20f883e
bob      | 878ef96e86145580c38c87f0410ad153
alice    | 99b1c2188db85afee403b1536010c2c9

考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:

'e10adc3949ba59abbe56e057f20f883e': '123456''21218cca77804d2ba1922c33e0151105': '888888''5f4dcc3b5aa765d61d8327deb882cf99': 'password'

这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢?

由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

?
1
2
3
4
5
6
7
8
9
10
11
12
import hashlib
md5 = hashlib.md5('salt'.encode('utf-8'))  #这是加盐了的
md5.update('how你好啊,我不好'.encode('utf-8'))
print(md5.hexdigest()) 
#结果 49f3d086ef5582b12d294c6f1b1c9dea
import hashlib
md5 = hashlib.md5()
md5.update('how你好啊,我不好'.encode('utf-8'))
print(md5.hexdigest()) 
#结果 3bfa4bfb7b59a59f27c24ebdd89cd13c

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?

如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。

摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

转载于:https://www.cnblogs.com/sl123/p/10305791.html

os sys hashlib相关推荐

  1. 序列化,os,sys,hashlib,collections

    序列化,os,sys,hashlib,collections 1.序列化 什么是序列化?序列化的本质就是将一种数据结构(如字典,列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化. ...

  2. python基础之 序列化,os,sys,random,hashlib

    1.序列化 什么是序列化? 是将对象的状态信息转化为可以存储或传输的过程. 简单来说序列化就是一种用来处理对象流的机制.所谓对象流也就是将对象的 内容进行流化,流的概念这里不用多说(就是I/O).我们 ...

  3. python常见模块命令(os/sys/platform)

    python常见模块命令(os/sys/platform) 一.Os Python的标准库中的os模块主要涉及普遍的操作系统功能.可以在Linux和Windows下运行,与平台无关. os.sep 可 ...

  4. 7.18 collection random os sys等模块

    7.18 collection random os sys等模块 collection模块 应用场景1 # 具名元组 # 想表示坐标点x为1 y为2 z为5的坐标 from collections i ...

  5. 常用模块之 time,datetime,random,os,sys

    time与datetime模块 先认识几个python中关于时间的名词: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行&qu ...

  6. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块) 一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其它内 ...

  7. python 发红包import random用redenv_python 常用模块之random,os,sys 模块

    python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...

  8. python基础 -23- 模块(random,chardet,os,sys,copy,time,datetime,pytz,pickle,json,MD5,SHA-1,shutil,re等)

    为什么是模块?  在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.  为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含 ...

  9. 【django轻量级框架】点击前端按钮执行本地python程序(os sys的使用)

    文章目录 1 前言 2 修改前端代码 3 修改views.py 4 在本地python程序中使用sys导入环境 1 前言 提供一种思路. 2 修改前端代码 指定名字. 3 修改views.py 获取前 ...

最新文章

  1. Markdown解决图片存储问题
  2. 网络推广专员浅析如何在日常网络推广过程中增加网站转化率?
  3. $(document).ready() $(window).load 及js的window.onload
  4. 太爽了!宅男醒来后,发现自己变成了……
  5. 武汉大学计算机学院创业老师,胡瑞敏 - 教师简历 CV- 武汉大学计算机学院
  6. 再无风清扬,再有少年郎
  7. 腾讯云服务器放音乐,使用腾讯云函数实现网易云音乐自动打卡签到
  8. 新美大 java待遇_入我新美大的Java后台开发面试题总结
  9. maka做出好设计_MAKA下载-MAKA做出好设计最新版v4.15.1下载
  10. LSTM结构理解与python实现
  11. 【算法】快速排序算法原理及实现
  12. 使用cordova + vue搭建混合app框架
  13. 计算机网络具备哪些要素,一个计算机网络必须具备以下3个基本要素
  14. 磁盘分区管理工具(DiskGenius Pro 5.3)pjb 附安装教程
  15. 【手把手教你】使用Logistic回归、LDA和QDA模型预测指数涨跌
  16. 计算机工程师自荐信英语作文,工程师英文求职信范文
  17. arduino智能风扇
  18. 变电站蓄电池组全在线充放电测试应用案例
  19. C/C++浮点数的存储方式 IEEE-754标准,以及实现一个ftoa函数将浮点数转换为字符串
  20. 教你给多张图片进行名称编号

热门文章

  1. 软件包管理器 RPM 升级软件包过程分析
  2. 程序代码移植和烧录需要注意什么_购买建站模板需要注意什么问题
  3. 簇的局部变量中布尔类型_java基础2(变量、常量、数据类型)
  4. C++ 11 深度学习(六)智能指针综述
  5. ibm服务器芯片架构,IBM x366 服务器技术详解
  6. python 百分比数据_如何使用python计算数据列相对于另一列的百分比排名
  7. fwrite函数的一般调用形式是什么?
  8. java接口自动化Excel占位符_基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport的接口自动化测试框架...
  9. oracle把多行合并成字符串,怎样将Oracle多行转换成字符串?
  10. elementui ts vant冲突_如何解决vue多个ui框架css冲突?