Maison > développement back-end > Tutoriel Python > Une plongée approfondie dans le module hashlib en python

Une plongée approfondie dans le module hashlib en python

零到壹度
Libérer: 2018-04-14 11:28:13
original
2763 Les gens l'ont consulté


Le contenu de cet article est de partager avec vous une compréhension approfondie du module hashlib en python Il a une certaine valeur de référence Les amis dans le besoin peuvent s'y référer

hashlib


hashlib fournit principalement des fonctions de cryptage de caractères, intègre les modules md5 et sha et prend en charge md5, sha1, sha224, sha256, sha384, sha512 et autres algorithmes

Application spécifique

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#pyversion:python3.5
#owner:fuzj

import hashlib

# ######## md5 ########

string = "beyongjie"
md5 = hashlib.md5()
md5.update(string.encode('utf-8'))     #注意转码
res = md5.hexdigest()
print("md5加密结果:",res)

# ######## 

sha1 ########sha1 = hashlib.sha1()
sha1.update(string.encode('utf-8'))
res = sha1.hexdigest()
print("sha1加密结果:",res)

# ######## 

sha256 ########sha256 = hashlib.sha256()
sha256.update(string.encode('utf-8'))
res = sha256.hexdigest()
print("sha256加密结果:",res)

# ######## 

sha384 ########sha384 = hashlib.sha384()
sha384.update(string.encode('utf-8'))
res = sha384.hexdigest()
print("sha384加密结果:",res)

# ######## 
sha512 ########sha512= hashlib.sha512()
sha512.update(string.encode('utf-8'))
res = sha512.hexdigest()
print("sha512加密结果:",res)
Copier après la connexion
Résultat de sortie :

md5加密结果: 0e725e477851ff4076f774dc312d4748
sha1加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f
sha256加密结果: 1e62b55bfd02977943f885f6a0998af7cc9cfb95c8ac4a9f30ecccb7c05ec9f4
sha384加密结果: e91cdf0d2570de5c96ee84e8a12cddf16508685e7a03b3e811099cfcd54b7f52183e20197cff7c07f312157f0ba4875b
sha512加密结果: 3f0020a726e9c1cb5d22290c967f3dd1bcecb409a51a8088db520750c876aaec3f17a70d7981cd575ed4b89471f743f3f24a146a39d59f215ae3e208d0170073
Copier après la connexion
Remarque : le type de chaîne crypté par hashlib est un codage binaire. Le cryptage direct de la chaîne signalera le. erreur suivante :

sha1 = hashlib.sha1()
sha1.update(string)
res = sha1.hexdigest()print("sha1加密结果:",res)


TypeError: Unicode-objects must be encoded before hashing
Copier après la connexion
Vous pouvez utiliser encode pour convertir

shaa1 = hashlib.sha1()
shaa1.update(string.encode('utf-8'))
res = shaa1.hexdigest()print("sha1采用encode转换加密结果:",res)
Copier après la connexion
ou utiliser byte pour convertir en binaire

shab1 = hashlib.sha1()
shab1.update(bytes(string,encoding='utf-8'))
res = shab1.hexdigest()print("sha1采用byte转换的结果:",res)
Copier après la connexion
La sortie ci-dessus :

sha1采用encode转换加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f
sha1采用byte转换的结果: 458d32be8ea38b66300174970ab0a8c0b734252f
Copier après la connexion
Écrivez ici Un exemple de base d'utilisation de md5 pour crypter les mots de passe après la connexion de l'utilisateur au site Web afin d'approfondir la compréhension

#hashlib简单使用
def md5(arg):#这是加密函数,将传进来的函数加密
    md5_pwd = hashlib.md5(bytes('abd',encoding='utf-8'))
    md5_pwd.update(bytes(arg,encoding='utf-8'))
    return md5_pwd.hexdigest()#返回加密的数据
def log(user,pwd):#登陆时候时候的函数,由于md5不能反解,因此登陆的时候用正解
    with open('db','r',encoding='utf-8') as f:
        for line in f:
            u,p=line.strip().split('|')
            if u ==user and p == md5(pwd):#登陆的时候验证用户名以及加密的密码跟之前保存的是否一样
                return True
def register(user,pwd):#注册的时候把用户名和加密的密码写进文件,保存起来
    with open('db','a',encoding='utf-8') as f:
        temp = user+'|'+md5(pwd)
        f.write(temp)
 
i=input('1表示登陆,2表示注册:')
if i=='2':
    user = input('用户名:')
    pwd =input('密码:')
    register(user,pwd)
elif i=='1':
    user = user = input('用户名:')
    pwd =input('密码:')
    r=log(user,pwd)#验证用户名和密码
    if r ==True:
        print('登陆成功')
    else:
        print('登陆失败')
else:
    print('账号不存在')
Copier après la connexion
Ici, nous n'écrivons que brièvement sur l'enregistrement et la connexion d'un utilisateur


Méthodes communes

  • hash.update(arg) met à jour l'objet de hachage avec des paramètres de chaîne Remarque : si le même objet de hachage appelle ceci. méthode à plusieurs reprises, m.update(a ); m.update(b) est équivalent à m.update(a+b), voir l'exemple suivant

m = hashlib.md5()
m.update('a'.encode('utf-8'))
res = m.hexdigest()print("第一次a加密:",res)

m.update('b'.encode('utf-8'))
res = m.hexdigest()print("第二次b加密:",res)


m1 = hashlib.md5()
m1.update('b'.encode('utf-8'))
res = m1.hexdigest()print("b单独加密:",res)

m2 = hashlib.md5()
m2.update('ab'.encode('utf-8'))
res = m2.hexdigest()print("ab单独加密:",res)


输出结果:
第一次a加密: 0cc175b9c0f1b6a831c399e269772661
第二次b加密: 187ef4436122d1cc2f40dc2b92f0eba0
b单独加密: 92eb5ffee6ae2fec3ad71c777531578f
ab单独加密: 187ef4436122d1cc2f40dc2b92f0eba0
Copier après la connexion
  • hash.digest() renvoie Digest, sous forme de valeur de chaîne de données binaires,

  • hash.hexdigest() renvoie le résumé, sous forme de valeur de chaîne de données hexadécimale,

  • hash.copy() Copie

Cryptage avancé

Bien que l'algorithme de cryptage ci-dessus soit toujours très puissant, il présente des défauts, c'est-à-dire , il peut être inversé via le credential stuffing. Par conséquent, il est nécessaire d’ajouter une clé personnalisée à l’algorithme de chiffrement avant d’effectuer le chiffrement.

low = hashlib.md5()
low.update('ab'.encode('utf-8'))
res = low.hexdigest()print("普通加密:",res)

high = hashlib.md5(b'beyondjie')
high.update('ab'.encode('utf-8'))
res = high.hexdigest()print("采用key加密:",res)

输出结果:
普通加密: 187ef4436122d1cc2f40dc2b92f0eba0
采用key加密: 1b073f6b8cffe609751e4c98537b7653
Copier après la connexion

附加HMAC-SHA1各语言版本实现

在各大开放平台大行其道的互联网开发潮流中,调用各平台的API接口过程中,无一例外都会用到计算签名值(sig值)。而在各种计算签名的方法中,经常被采用的就是HMAC-SHA1,现对HMAC-SHA1做一个简单的介绍:

        HMAC,散列消息鉴别码,基于密钥的Hash算法认证协议。实现原理为:利用已经公开的Hash函数和私有的密钥,来生成固定长度的消息鉴别码;

        SHA1、MD5等Hash算法是比较常用的不可逆Hash签名计算方法;

        BASE64,将任意序列的8字节字符转换为人眼无法直接识别的符号编码的一种方法;

        各个语言版本的实现为:

        Python版:       
               import hmac
                             
               import hashlib
                             
               import base64

              hmac.new(Token,data,hashlib.sha1).digest().encode('base64').rstrip()

Token:即接口的key

data:要加密的数据

        PHP版:
              base64_encode(hash_hmac("SHA1",clientStr,Token , true))
          C++版(Openssl):

               HMAC(  EVP_sha1(),           
               
                       /*key data*/ strKey.data(),                   
                       /*key len*/  strKey.size(),                   
                       /*data  */(unsigned char*) strRandom.data(),                   
                       /*data len*/ strRandom.size(), digest, &digest_len))
       Shell版:
              echo -n '3f88a95c532bea70' | openssl dgst -hmac '123' -sha1 -binary | base64
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal