Python加密技术(第1节)


1、数据安全的概述

自从进入互联网和数字化时代以来,信息安全对于企业和个人的生存和发展都变得越来越重要。每时每刻,大量的敏感数据都会在网络上传输和存储,包括个人数据、商业机密、金融交易记录等。 近些年,黑客对各种系统的攻击越来越频繁,数据泄露的可能性也越来越大。例如,由于非法访问企业数据库,数以千计的用户信息被盗,这不仅对用户的利益产生了负面影响,同时对企业的声誉也产生了严重影响。与此同时,世界各国政府都实施了严格的数据保护法,包括我国的《个人信息保护法》和欧盟的《GDPR》,这些法律提高了对企业和组织的数据安全管理的要求。

2、加密技术介绍

如今,由于互联网的迅速发展,各种应用不断涌现,用户的数据也在不断增长,加密技术变得至关重要。数据加密是一种重要的信息安全技术,用于保护数据的机密性和完整性。数据加密就是把用户数据进行加密处理的过程,使得数据的安全性得到保证。数据加密是数据通信过程的重要组成部分。数据加密算法主要包括对称加密非对称加密哈希算法(Hash)等。

(1)对称加密

对称加密也称为私钥加密,是指信息的发送方和接受方利用相同的加密密钥对数据进行加密和解密。常见的对称加密算法有DES、AES、3DES、RC4、RC5、RC6等,目前最广泛应用的对称加密算法是AES。

对称加密的最大优势是加密和解密速度快,适合对大量数据进行加密,对称加密的缺点是密钥的管理和分配比较麻烦,因为发送方和接受方都必须共享同一个密钥,如果要和N方进行通信,就要保管N组密钥,维护成本较大,而且任何一方丢失密钥就会导致数据被破解。

(2)非对称加密

非对称加密也称为公钥加密,与对称加密算法不同,非对称加密包括两个密钥,一个公开密钥(public key)和一个私有密钥(private key)。公开密钥和私有密钥是成对出现的,公开密钥用于加密消息,私有密钥用于解密消息。如果用公开密钥对一组数据进行加密,只有对应的私有密钥才可以对其解密。因为加密和解密使用了不同的密钥,所以被称为非对称加密算法。公开密钥可以公开共享,而私有密钥必须保密。比如你向银行请求公开密钥,银行将公开密钥发给你,你使用公开密钥对消息加密,那么只有私有密钥的持有人(银行)才能对你的消息解密。与对称加密的不同之处是,银行不需要将私钥通过网络发送出去,因此安全性大幅度提高。常见的非对称加密算法有RSA、ECC(椭圆曲线)、Diffie-Hellman、ElGamal等,目前最常用的非对称加密算法是RSA算法。

(3)哈希算法(Hash)

哈希算法(Hash)也叫摘要算法、散列算法,它通过一个函数将任意长度的数据转换成固定长度的哈希值。哈希算法是单向加密的,也就是说字符串通过哈希算法加密之后,是不能解密的。常用的哈希算法有MD5、SHA、SHA1、SHA256、SHA384、SHA512等。

哈希函数的工作原理更像是指纹提取机,它将任意长度的数据转换成固定长度的唯一标识,称为哈希值或消息摘要。例如,当您输入密码进行在线购物时,购物网站并不会直接保存你的密码,而是保存密码经过哈希后的唯一哈希值。这种情况下,即使数据库被入侵,攻击者拿到的也只是无法被反向破解的哈希值。

3、加密技术的运用

使用MD5加密

MD5(Message Digest Algorithm 5)是Python中常见的哈希算法(Hash)。MD5算法会将任意长度的数据转换为128位的哈希值,被广泛用于数据校验、数据完整性验证和密码学中。然而,由于MD5的安全性较差,不再推荐在安全敏感的场景中使用。

在Python中,使用内置的hashlib模块可以方便地计算MD5哈希值,例如:

动手练一练:

import hashlib

# 原始数据
data = "学Python编程,进入www.pyhint.com在线学习"

# 创建MD5哈希对象
md5 = hashlib.md5(data.encode())

# 获取MD5哈希值
result = md5.hexdigest()

print(f"原始消息:{data}")
print(f"MD5哈希值:{result}")

执行以上代码,输出结果为:

原始消息学Python编程进入www.pyhint.com在线学习
MD5哈希值a9bb90cd97fa241ff71e52153d4c7b7f

上面的例子中,通过hashlib.md5()函数,我们成功将输入的数据进行了MD5加密,并生成了对应的哈希值。

MD5加密算法在计算机领域中有着广泛的应用,包括密码存储、数据完整性校验等方面。许多网站和应用程序会使用MD5算法对用户密码进行加密存储,以确保用户密码的安全性,当用户登录时,通过验证MD5来检查用户输入密码的正确性。例如:

动手练一练:

import hashlib

class Login:
    def __init__(self, username, password):
        self.username = username
        md5_hash = hashlib.md5(password.encode())
        self.password = md5_hash.hexdigest()

    def checkt_username(self, password):
        md5_hash = hashlib.md5(password.encode())
        if md5_hash.hexdigest() == self.password:
            return password + ":密码正确"
        else:
            return password + ":密码错误"

login = Login("Pyhint", "123456")
print("md5加密后的数据是:", login.password)
print(login.checkt_username("123456"))
print(login.checkt_username("12345"))

执行以上代码,输出结果为:

md5加密后的数据是 e10adc3949ba59abbe56e057f20f883e
123456密码正确
12345密码错误

由于MD5算法的特性,无法从哈希值还原出原始数据,因此无法进行MD5解密。但是,MD5本身存在一些缺点,这些缺点的存在导致MD5并不是很安全,有可能会带来信息安全问题。因为用户习惯用容易记住的密码,比如手机号码、生日等,不法分子容易获取这类密码。不法分子还可能通过简单粗暴的方法破解密码,即通过不断尝试不同的可能性来破解MD5加密的数据。例如,通过遍历所有可能的密码字符串组合,计算它们的MD5哈希值,并与目标MD5值进行比对,直到找到匹配的字符串。

为了增加MD5算法的安全性,通常会在原始数据的基础上添加一个随机的“盐”(salt),或者增加MD5加密次数等技术手段来增强数据安全性。

动手练一练:

import hashlib

def md5_1(content):
    return hashlib.md5(content.encode()).hexdigest()

class Login:
    def __init__(self, password):
        self.password = md5_1(md5_1(password))

    def checkt_password(self, psd):
        if md5_1(md5_1(psd)) == self.password:
            return psd + ":密码正确"
        else:
            return psd + ":密码错误"

login = Login("pyhint123")
print("双层md5加密后的数据是:", login.password)
print(login.checkt_password("pyhint"))     # 输出 密码错误
print(login.checkt_password("123"))        # 输出 密码错误
print(login.checkt_password("pyhint123"))  # 输出 密码正确

执行以上代码,输出结果为:

双层md5加密后的数据是 5563c4b0bf0d3878afdbb868a8e56516
pyhint密码错误
123密码错误
pyhint123密码正确