hashlib 模塊用來進行hash

hashlib的基本概述:

  python中的 hashlib 模塊用來進行hash 或者md5加密,而且這種加密是不可逆的,所以這種算法又被稱為摘要算法,

其支持Opennssl庫提供的所有算法,包括 md5、sha1、sha224、sha256、sha512 等。

?

?

hash是一種算法 是將一個任意長的數據 根據計算 得到一個固定長度特征嗎

 特征:1、不同輸入 ? 可能會有相同的結果 幾率特別小

    2、相同的輸入 必然得到相同結果

    3、由于散列(特征)的性質 從原理來看是不可能 反解

    4、用來 驗證 ? 兩個輸入的數據是否一致

 使用場景

   1、密碼驗證

   2、驗證數據是否被篡改? 比如游戲安裝包 ?? 有沒有被改過

 為了防止別人撞庫成功? 可用提升密碼的復雜度 ? 其次可以為密碼加鹽(加點內容進去)

ps:撞庫破解的原理? 把常見的 明文和密文的對應關系 存到了數據庫中? 運氣好就能查詢到

?

常用的屬性方法

  algorithms : 列出所有加密算法

  digesti——size: 產生的散列的字節大小

  md5()/sha1() :創建一個 md5 或者 sha1加密模式的hash 對象

  update(arg) :用字符串參數來更新hash對象,如果同一個has對象重復調用該方法,如下:m.update(a); m.update(b), 則等于m.update(a+b)

  digest() : 返回摘要,作為二進制數據字符串值

  hexdigest() : 返回摘要,作為十六進制數據字符串值

  copy() :復制

?

下面是一個簡單的實例:

import  hashlib
m = hashlib.md5("aaa".encode("utf-8"))
print(m.hexdigest())

結果如下:

47bce5c74f589f4867dbd57e9ca9f808

?

下面是一個簡單的加鹽實例:

import  hashlibm = hashlib.md5("321".encode("utf-8"))
#
m.update("abcdefplkjoujhh".encode("utf-8"))print(m.hexdigest())

結果如下:

7da0befdd8fd811dd0716941c38c0111

?

關于hmac 的實例:

import hmac
# 與hashlib 沒啥區別 只是在創建的時候必須加鹽
h = hmac.new("abcdefjjjj".encode("utf-8"))h.update("123".encode("utf-8"))print(h.hexdigest())

結果如下:

944b3523fac69f32f6d399a11707da8b

?

如何產生hash值的三個階段:

import hashlib
# # ######## sha256 ########
# # 1、造出hash工廠
hash = hashlib.sha256('12345ds232'.encode('utf8'))     #同一種hash算法得到的長度是固定的
# # 2、運送原材料
hash.update('alvin'.encode('utf8'))                     #工廠傳入的原材料都是bytes類型
# # 3、產出hash值
print(hash.hexdigest())                     #結果:0f63932f6e2b2d1e0d9c2d50f0e9d39b79da78a5048a6d054d7f9c27d1a8761a

?

效驗文件的一致性(如何保證下載的文件過程中不丟包,保證數據的完整性!):

# -----------文件一致校驗----------------
'''可以拷貝一個文件放在兩個不同的盤中,然后通過判斷兩個文件的hash值是否相等,判斷兩個文件是否是同一個文件'''
import hashlib
m = hashlib.md5()
with open(r'F:\oldboy課程記錄\目錄創建函數.py','rb') as f:for line in f:m.update(line)
print(m.hexdigest())          #18b6754864943d03b5b2aedacb449466import hashlib
m = hashlib.md5()
with open(r'F:\oldboy課程記錄\購物車練習.py','rb') as f:for line in f:m.update(line)
print(m.hexdigest())           #8e63f67a0049d1fc583a5c2bbf6cf3a8

?

對密碼進行加鹽(加密):

# 應用:對明文密碼進行加密(暴力破解-------用明文密碼用一種算法算出一個hash值,與截取的hash值進行比對,比對成功說明明文密碼一致,就可以破解用戶的密碼)
'''如用戶在某網站進行注冊信息,這個時候防止信息被惡意攔截獲取,可以對用戶明文密碼進行加密,存成hash值得形式,這樣用戶每次登陸雖然輸的是明文密碼,校驗hash值即可'''
#未加密
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update(password.encode('utf-8'))
print(m.hexdigest())             #00dcbdaede875d5e23f1f9f64c7849ef# 對密碼進行加鹽(暗號)----------進一步加強密碼的安全性
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update('一行白鷺上青天'.encode('utf-8'))         #對密碼加鹽
m.update(password.encode('utf-8'))
print(m.hexdigest())  

?

hmac模塊的加密方式,與hashlib差不多:

'''python 還有一個 hmac 模塊,它內部對我們創建 key 和 內容 進行進一步的處理然后再加密:'''
import hmac
h = hmac.new('天王蓋地虎'.encode('utf8'))          #hmac必須要加鹽
h.update('hello'.encode('utf8'))
print(h.hexdigest())                 #1abaae8f65f68f2695a8545c5bc8e738#要想保證hmac最終結果一致,必須保證:
#1:hmac.new括號內指定的初始key一樣
#2:無論update多少次,校驗的內容累加到一起是一樣的內容

# 下面單重方式得到的結果是一樣的
import hmac
h1=hmac.new(b'tom')          #初始值必須保證一致,最終得到的結果就會不一樣
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())h2=hmac.new(b'tom')         #初始值必須保證一致,最終得到的結果就會不一樣
h2.update(b'helloworld')
print(h2.hexdigest())h3=hmac.new(b'tomhelloworld')   #初始值不一樣,所以與上面兩種的結果不一樣
print(h3.hexdigest())

結果如下:

0426ccec3b134e8c18fdcefee841ef25
0426ccec3b134e8c18fdcefee841ef25
ff1214d895bbaf5f1847db4ebae8212e

?

破解用戶的密碼

# 重點
'''模擬撞庫破解密碼'''
import hashlib
passwds=[                      #可以通過random實現對passwds中的內容'alex3714','alex1313','alex94139413','alex123456','123456alex','a123lex',]def make_passwd_dic(passwds):                #通過明文密碼列表,造出與之對應的hash值得字典dic={}for passwd in passwds:m=hashlib.md5()                      #使用md5算法,造了一個工廠m.update(passwd.encode('utf-8'))     #給工廠運送原材料(即我們要加密的內容)dic[passwd]=m.hexdigest()            #產出hash值(即最終的產品),將其加入到我們事先造好的空字典中,字典形式:{密碼:hash值}return dicdef break_code(cryptograph,passwd_dic):      #判斷攔截的hash值是否與字典中事先造好的hash值相等,相等則說明成功進行破解for k,v in passwd_dic.items():if v == cryptograph:print('密碼是===>\033[46m%s\033[0m' %k)cryptograph='aee949757a2e698417463d47acac93df'     #我們攔截拿到的密碼,經過加密的hash值
break_code(cryptograph,make_passwd_dic(passwds))   #將要破解的密碼hash值,和事先造好的hash的字典當做函數的實參傳給對應的形參

?

轉載于:https://www.cnblogs.com/TF511/p/9818605.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279132.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279132.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279132.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Ubuntu 11.10中將窗口按鈕移回右側

As of Ubuntu 10.04, the minimize, maximize, and close buttons on all windows were moved to the left side and the system menu was removed. Prior to version 11.10, you could use several methods to restore the original button arrangement. 從Ubuntu 10.04開始&a…

java測試開發_測試開發系類之Java常用知識點

測試需要的兩門語言:Java,Python測試開發:開發測試腳本->開發測試框架Java需要掌握內容:基礎語法、Java面向對象相關概念、Java常用類、基礎測試框架Java常用類:IO相關類,包括:字節流InputSt…

kafka 服務端消費者和生產者的配置

在kafka的安裝目錄下,config目錄下有個名字叫做producer.properties的配置文件 #指定kafka節點列表,用于獲取metadata,不必全部指定 #需要kafka的服務器地址,來獲取每一個topic的分片數等元數據信息。 metadata.broker.listkafka0…

如何在Windows 10上使用觸摸板手勢

If you’ve used a touchpad in Windows 10, you’re no doubt aware of the basic single-finger tapping and two-finger scrolling gestures. Windows 10 also packs in some additional gestures you might not have tried. 如果您在Windows 10中使用了觸摸板,那…

java全棧開發工程師_談談我對Java(J2EE)全棧工程師的理解

很多剛從事Java開發的同學都有一個疑問,到底是向全棧式程序員方向發展還是做精通某種技術的專才?對于這個問題也是見仁見智。 在給出我的觀點之前,我們先來分析一下全棧工程師的種類和專才的種類 ,之后關于這個問題的答案就很清楚…

多網卡命名規則

使用iptables做nat路由,需要幾張網卡,以下命令很有用 1.首先你要先確認你系統加載的網卡,lspci|grep -i eth,如果出現unknow情況或者未識別,最好換網卡,或者是驅動沒有加載,需要到/lib/modules的子目錄driv…

相機模擬光圈_我的相機應該使用什么光圈?

相機模擬光圈Aperture, along with shutter speed and ISO, is one of the three most important settings you control when you take a photo. It affects both the amount of light that hits your camera sensor and the depth of field of your images. Let’s look at ho…

2018-2019-1 20165234 《信息安全系統設計基礎》第四周學習總結

一、學習目標 了解ISA抽象的作用 掌握ISA,并能舉一反三學習其他體系結構 了解流水線和實現方式二、學習內容 Y86-64指令 movq指令 irmovq rrmovq mrmovq rmmovq四個整數操指令 addq,subq,andq,xorq只對寄存器數據進行操作7個跳轉指令 cmovle cmovl cmove cmovne cmo…

python數據庫實例_Python3.6簡單的操作Mysql數據庫的三個實例

安裝pymysql參考:https://github.com/PyMySQL/PyMySQL/pip install pymsql實例一import pymysql# 創建連接# 參數依次對應服務器地址,用戶名,密碼,數據庫conn pymysql.connect(host127.0.0.1, userroot, passwd123456, dbdemo)# …

Python之釘釘機器人推送天氣預報

通過Python腳本結合釘釘機器人,定時向釘釘群推送天氣預報 #!/usr/bin/python # -*- coding: utf-8 -*- # Author: aikergdedu.ml # My blog http://m51cto.51cto.blog.com import requests import re import urllib2 import json import sys import osheaders {Co…

google +按鈕_如何禁用或改善Google的Google+集成

google 按鈕If you’ve used Google lately, you’ve probably seen Google taking over Google’s search results. You don’t have to put up with it — you can disable the integration, show better social-networking pages or hide those pesky Google notifications.…

P2680 運輸計劃

傳送門 十分顯然完成工作的時間和航耗時最長的運輸計劃有關 所以題目意思就是要求最大值最小 所以可以想到二分 把所有大于mid時間的航線打上標記,顯然刪邊只能在所有這些航線的公共路徑上 要如何快速打標記是個問題 二分已經有一個log,所以只能承受O(n)…

java 集合讀寫同步_JAVA多線程學習十六 - 同步集合類的應用

1.引言在多線程的環境中,如果想要使用容器類,就需要注意所使用的容器類是否是線程安全的。在最早開始,人們一般都在使用同步容器(Vector,HashTable),其基本的原理,就是針對容器的每一個操作,都添加synchronized來進行同…

Linux下的parted工具的使用 GPT分區安裝系統

安裝系統是安裝前時候ctrlatlF2 fdisk -l parted select /dev/sdb mklabel msdos # 將GPT磁盤格式化為MBR磁盤 對大硬盤進行分區 xfs 和 ntfs Linux下的parted工具的使用也很簡單,具體操作如下: rootme:/mnt# parted /dev/sda Using /dev/sda Welcome to…

ubuntu自定義菜單_如何自定義Ubuntu的每日消息

ubuntu自定義菜單Ubuntu displays an informative message, known as the message of the day, when a user logs in at the terminal. The MOTD is fully customizable — you can add your own text and other dynamic data. 當用戶在終端上登錄時,Ubuntu將顯示信…

java避免使用orderby_java – @OrderBy在JPA中無法正常工作

OrderBy如何運作?它在以下代碼中不起作用:Employee.javapackage com.semanticbits.pojo;import java.util.List;import javax.persistence.CascadeType;import javax.persistence.Embedded;import javax.persistence.Entity;import javax.persistence.Ge…

BigDecimal四舍五入與保留位

1.引言 借用《Effactive Java》這本書中的話,float和double類型的主要設計目標是為了科學計算和工程計算。他們執行二進制浮點運算,這是為了在廣域數值范圍上提供較為精確的快速近似計算而精心設計的。然而,它們沒有提供完全精確的結果&#…

火狐web開發清楚緩存_如何使用Firefox的Web開發工具

火狐web開發清楚緩存Firefox’s Web Developer menu contains tools for inspecting pages, executing arbitrary JavaScript code, and viewing HTTP requests and other messages. Firefox 10 added an all-new Inspector tool and updated Scratchpad. Firefox的Web Develop…

Leetcode400Nth Digit第N個數字

在無限的整數序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 個數字。 注意: n 是正數且在32為整形范圍內 ( n < 231)。 示例 1: 輸入: 3 輸出: 3 示例 2: 輸入: 11 輸出: 0 說明: 第11個數字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0&#xff0c;它是…

Java基類共同屬性設置_多選擇基類的訪問屬性-Java初學筆記

多選擇基類的訪問屬性你現在知道在定義類的訪間屬性時可用的選擇項&#xff0c;你希望使用這些類定義子類。你知道在類繼承上這些屬性所具有的效果&#xff0c;但是你如何決定到底應該使用哪一個呢?這里沒有死板和現成的規則&#xff0c;你選擇的訪問屬性取決于在將來你想用類…