python的hashlib模塊


一、hashlib基本使用

  python中的hashlib模塊用來進行hash或者md5加密,而且這種加密是不可逆的,所以這種算法又被稱為摘要算法。其支持Openssl庫提供的所有算法,包括md5、sha1、sha224、sha256、sha512等。

常用的屬性和方法:

algorithms:列出所有加密算法('md5','sha1','sha224','sha256','sha384','sha512')

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()
m.update('how to use md5'.encode('utf-8'))
m.update('in python hashlib'.encode('utf-8'))
print m.hexdigest()

返回值如下:

9f97604918a2e86bfcc4aea5c35a4c8b

 

下面一個示例用於計算文件md5值:

#!/usr/bin/env python
#coding: utf-8

import hashlib
import sys

def main():
    if len(sys.argv) != 2:
        sys.exit('Usage: %s file' % sys.argv[0])

    filename = sys.argv[1]
    m = hashlib.md5()
    with open(filename, 'rb') as fp:
        while True:
            blk = fp.read(4096) # 每次讀取4kb
            if not blk: break
            m.update(blk)
    print m.hexdigest(), filename

if __name__ == '__main__':
    main()

 

二、hashlib的應用場景

  摘要算法通常應用於網站存儲用戶的帳號密碼相關信息。默認情況下,我們插入到數據庫的帳號密碼都是以明文保存。這樣的話,一旦數據庫泄露,所有用戶的口令都會直接泄露,而且明文保存,網站管理員也可以直接查看到用戶口令,這樣及不安全。所以我們可以在獲取到用戶輸入的密碼以后,直接對其進行加密處理。然后將加密的字符串存入數據庫。這樣當下次用戶登錄時,再對用戶輸入的密碼進行加密處理,然后與數據庫中存儲的加密字串進行比對,如果匹配,則說明密碼正確。

  當然上述方法比明文存儲密碼確實要安全不少。但在有些場景中,用戶通常會將密碼設置的尤為簡單。這樣如果數據庫泄露,黑客可以通過簡單的密碼嘗試來完成對加密字串的匹配。為了解決這種方法,我們通常需要對密碼做“加鹽”處理。如下:

def get_md5(password):  
    m = hashlib.md5()
    m.update(password)
    return m.hexdigest()

def calc_md5(password):
    return get_md5(password + 'the-Salt')


db = {}

def register(username,password):
    db[username] = username
    db[password] = calc_md5(password)

 

這樣,只要'the-Salt'部分不被泄露,就沒辦法反推用戶的簡單密碼。

但是這樣仍然有個問題,那就是多個用戶的密碼可能重復,這樣,在數據庫里就會出現相同的加密字串。我們知道通常而言,用戶的用戶名肯定不會相同。我們再假設用戶的用戶名不會改變。我們可以使用用戶的用戶名來做加鹽處理,如下:

def clc_md5(username,password):
    return get_md5(passwd + username + 'the-Salt')

 


免責聲明!

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



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