Python 散列和加盐

举报
Q神 发表于 2023/06/23 11:20:52 2023/06/23
【摘要】 在本文中,我们将学习Python中的散列,散列算法 - MD5(消息摘要算法5),SHA-1(安全散列算法1),SHA-256(安全散列算法256),SHA-512(安全散列算法)算法 512),最新和推荐的密码存储哈希技术是bcrypt、scrypt和Argon2。我们还将研究加盐的全部内容,这肯定会是一篇非常有趣的文章,所以让我们直接开始吧。什么是盐腌?近年来,网络犯罪日益频繁,为了获取...

在本文中,我们将学习Python中的散列,散列算法 - MD5(消息摘要算法5),SHA-1(安全散列算法1),SHA-256(安全散列算法256),SHA-512(安全散列算法)算法 512),最新和推荐的密码存储哈希技术是bcryptscryptArgon2

我们还将研究加盐的全部内容,这肯定会是一篇非常有趣的文章,所以让我们直接开始吧。

什么是盐腌?

近年来,网络犯罪日益频繁,为了获取密码、用户信息和其他敏感数据,黑客想出了各种策略。因此,开发人员必须采取安全措施来保护用户的数据。加盐密码是这些保护措施之一。

加盐是一种防止黑客快速破解用户密码的安全措施。在对用户的密码进行哈希处理之前,它会向其中添加一个随机字符串,salt 是该任意字符串的名称。密码和盐被组合,然后对结果字符串进行哈希处理。此过程使字典攻击暴力攻击彩虹表攻击等密码破解技术变得更具挑战性。

加盐的原因

在对密码进行哈希处理时应使用盐有多种原因。其中一些原因包括:

  • 防止内部攻击:加盐使内部人员更难窃取密码,因为他们无法轻易破解密码。

  • 防止暴力攻击:暴力攻击涉及尝试所有可能的字符组合,直到找到正确的密码。通过加盐,即使黑客成功破解了一个密码,它也无法为其他具有相似密码的用户所用。

  • 防止字典攻击:通过加盐,即使多个用户使用相同的密码,他们最终也会得到不同的哈希值。这使得黑客更难使用彩虹表等预先计算的表来破解密码。

  • 遵守法规:许多数据保护法规要求安全存储密码。对密码进行加盐处理是确保您遵守这些法规的好方法。

在 Python 中,可以使用内置的 hashlib 模块来完成加盐。以下是如何在 Python 中对密码加盐的示例:

import hashlib
import os

password = '1234!3#'
salt = os.urandom(32)
hashed_password = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000)

在上面的示例中,我们首先使用该方法生成随机盐os.urandom()。然后我们使用该hashlib.pbkdf2_hmac()方法用盐对密码进行哈希处理。该pbkdf2_hmac()方法是常用于密码散列的密钥派生函数。它需要四个参数:

  • 要使用的哈希算法(在本例中为SHA-256)。
  • 要哈希的密码(编码为bytes)。
  • 要使用的盐(也编码为bytes)。
  • 要使用的迭代次数(本例中为100000 )。

该方法的输出pbkdf2_hmac()是散列密码,可以存储在数据库中或用于身份验证。

有了这样的理解,我们就可以开始学习哈希了。

什么是哈希

Python 中的散列是将输入转换为固定长度字节序列的过程,称为散列或消息摘要。哈希值是使用数学函数生成的,该函数将输入数据映射到固定大小的字节数组。这个过程是不可逆的,这意味着不可能从哈希中重建输入数据。

哈希应用程序

哈希有多种应用,包括:

  • 数据完整性:哈希可用于通过生成数据的哈希值并将其与原始数据的哈希值进行比较来确保数据的完整性。如果哈希值匹配,则表明数据未被篡改。

  • 密码存储:哈希通常用于以安全的方式存储密码。当用户创建密码时,它会被散列并存储在数据库中。当用户登录时,他们输入的密码将被散列并与存储的散列进行比较。如果哈希值匹配,则用户通过身份验证。

  • 索引和搜索:散列可用于创建索引以快速搜索和检索数据。计算机科学中通常使用哈希表来实现此功能。

  • 数字签名:哈希可用于创建数字签名,可用于验证数字文档的真实性。数字签名是通过对文档进行哈希处理,然后使用签名者的私钥对哈希值进行加密来创建的。然后,接收者可以使用签名者的公钥来解密哈希并将其与原始文档的哈希进行比较。

哈希算法

尽管 Python 中有多种哈希算法,但我们在本节中仅研究其中的几种。

  • MD5(消息摘要算法5)
import hashlib

# Create a hash object using MD5 algorithm
hash_object = hashlib.md5()

# Update the hash object with a message
hash_object.update(b"Hello, world!")

# Get the hexadecimal digest of the hash
hex_dig = hash_object.hexdigest()

print(hex_dig)

此代码创建该类的一个实例hashlib.md5(),用消息“ Hello, world! ”更新它,并获取哈希值的十六进制摘要。MD5是一种广泛使用的哈希函数,但它有一些弱点,不应该用于加密目的。

  • SHA-1(安全哈希算法 1)
import hashlib

# Create a hash object using SHA-1 algorithm
hash_object = hashlib.sha1()

# Update the hash object with a message
hash_object.update(b"Hello, world!")

# Get the hexadecimal digest of the hash
hex_dig = hash_object.hexdigest()

print(hex_dig)

此代码创建该类的一个实例hashlib.sha1(),用消息“ Hello, world! ”更新它,并获取哈希值的十六进制摘要。SHA-1也被广泛使用,但已发现它有一些弱点,应谨慎使用。

  • SHA-256(安全哈希算法 256)
import hashlib

# Create a hash object using SHA-256 algorithm
hash_object = hashlib.sha256()

# Update the hash object with a message
hash_object.update(b"Hello, world!")

# Get the hexadecimal digest of the hash
hex_dig = hash_object.hexdigest()

print(hex_dig)

此代码创建该类的一个实例hashlib.sha256(),用消息“ Hello, world! ”更新它,并获取哈希值的十六进制摘要。SHA-256是比 MD5 或SHA-1更安全的哈希函数,通常用于密码学。

  • SHA-512(安全哈希算法 512)
import hashlib

# Create a hash object using SHA-512 algorithm
hash_object = hashlib.sha512()

# Update the hash object with a message
hash_object.update(b"Hello, world!")

# Get the hexadecimal digest of the hash
hex_dig = hash_object.hexdigest()

print(hex_dig)

此代码创建该类的一个实例hashlib.sha512(),用消息“ Hello, world! ”更新它,并获取哈希值的十六进制摘要。SHA-512是比SHA-256更安全的哈希函数,但它也较慢,并且可能并非所有应用程序都需要。

Python 哈希技术

  • Scrypt:是一种基于密码的密钥派生函数,其设计成本很高,因此很难通过暴力方法进行攻击。它通常用于密码存储和身份验证目的。scrypt算法与bcrypt类似,但被设计为更加内存困难,这使得创建用于破解scrypt哈希的专用硬件变得更加困难。

让我们看看它是如何实现的。

import scrypt

# Hash a password
password = b"password1234#$"
salt = scrypt.gensalt()
hashed_password = scrypt.hash(password, salt)

# Verify a password
password_to_verify = b"password1234#$"
if scrypt.verify(password_to_verify, hashed_password):
    print("Password is correct")
else:
    print("Invalid password")

  • Bcrypt:是一个流行的密码哈希库,用于安全密码存储。它使用 Blowfish 算法来执行哈希函数,使其成为最安全且最慢的密码哈希函数之一。

让我们看看它是如何实现的。

import bcrypt

# Hash a password
password = b"password1234#$".encode()
salt = bcrypt.gensalt()
hashed_password = bcrypt.hashpw(password, salt)

# Verify a password
password_to_verify = b"password1234#$".encode()
if bcrypt.checkpw(password_to_verify, hashed_password):
    print("Password is correct")
else:
    print("Invalid password")

  • Argon2:是一种较新的密码哈希算法,目前被认为是可用的最强、最安全的哈希算法之一。它是 2015 年密码哈希竞赛的获胜者,现在广泛用于许多现代应用程序中的密码存储。

以下是如何使用该库在 Python 中使用Argon2算法的示例argon2

import argon2

# Define the password to be hashed
password = b'password1234#$'

# Hash the password using Argon2
hasher = argon2.PasswordHasher()
hashed_password = hasher.hash(password)

# Print the hashed password
print(hashed_password)

# Verify a password against a hashed password
# Note that this will return True if the password matches the hash
# and False if it does not.
new_password = b'password1234#$'
try:
    hasher.verify(hashed_password, new_password)
    print("Password is valid.")
except argon2.exceptions.VerifyMismatchError:
    print("Password is incorrect.")

在此示例中,我们首先定义要散列的密码。然后我们创建该类的一个实例argon2.PasswordHasher()并使用它来哈希密码。生成的散列密码存储在hashed_password变量中。

verify()然后,我们可以使用该类的方法根据散列密码验证密码argon2.PasswordHasher()。如果密码与哈希值匹配,该方法将返回True。如果密码与哈希值不匹配,该方法将引发一个argon2.exceptions.VerifyMismatchError.

结论

总结、散列和加盐是增强 Python 中密码和敏感数据安全性的重要技术。散列可以创建固定大小、唯一且不可逆的数据表示形式,而加盐则通过在散列之前向数据添加随机字符串来增加额外的安全层。我们讨论了 Python 中使用的流行哈希算法,包括SHA-256bcryptscryptArgon2,以及每种算法的代码示例和解释。根据您的具体安全要求选择正确的算法非常重要。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。