一、简介
数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露、篡改或滥用。
二、常见的加密方式 1. 对称加密定义:加密和解密使用同一个密钥。
特点:加密和解密速度快,适合加密大量数据。但密钥需要安全地传输和存储,否则容易被窃取,破坏数据的保密性。
常见算法:DES(尽管已被认为不够安全)、3DES、AES(目前使用最广泛的对称加密算法之一,具有高安全性和加密效率)。
2. 非对称加密定义:加密和解密使用一对密钥,分别为公钥和私钥。公钥可以公开,私钥必须保密。
特点:公钥可以公开,私钥只有持有者知道,即使公钥被泄露,数据也不会失去保密性。但加密和解密速度较慢,适合加密少量数据和数字签名等场景。
常见算法:RSA(目前应用最广泛的非对称加密算法,安全性高,但速度较慢)、ECC(椭圆曲线加密算法,密钥长度较短,安全性高,加密解密速度快,适用于移动设备等资源有限的场景)、DSA(基于离散对数问题,适用于数字签名等场景)。
3. 单向加密(不可逆加密)定义:通过散列算法将明文生成散列值,散列值是长度固定的数据,与明文长度无关,且无法从散列值还原出原文。
特点:常用于数字签名、消息认证、密码存储等场景,不需要密钥。
常见算法:MD5(尽管已被破解,不再安全)、SHA-1(比MD5更安全,但速度较慢)、SHA-2(包括SHA-224、SHA-256等多个变种,安全性更高)、HMAC(带密钥的散列消息认证码,结合了散列算法和密钥的优势)。
三、python中的应用通过采用合适的加密技术和加强密钥管理,可以有效地保护数据的机密性、完整性和可用性,防止数据泄露、非法访问和篡改等安全事件的发生。本文主要介绍python中的常见加密算法的实现,以及某云的案例进行分析。
1、encode()编码encode():将字符串str转为二进制数据,即进行编码。
str_="xiaoyu安全" byte=str_.encode('utf-8') print('原字符:',str_) print('字符转换成二进制:',byte) 原字符:xiaoyu安全 字符转换成二进制 b'xiaoyu\xe5\xae\x89\xe5\x85\xa8' 2、decode()解码 str_="xiaoyu安全" byte=str_.encode('utf-8') print('原字符:',str_) print('字符转换成二进制:',byte) print('二进制转化为原字符:',byte.decode('utf-8')) 原字符:xiaoyu安全 字符转换成二进制:b'xiaoyu\xe5\xae\x89\xe5\x85\xa8' 二进制转化为原字符:xiaoyu安全 3、base64Base64编码是密码学的基础,它使用64个字符来表示任意二进制数据。
编码过程如下:首先将所有字符转换为ASCII码,然后将这些ASCII码转换为8位二进制数。接着,将每3个二进制数归为一组(不足3个的在后面补0),形成24位,再拆分成4组,每组6位。之后,在每组的6位二进制数前补两个0,凑成8位。最后,将这些补0后的二进制数转换为十进制数,并从Base64编码表中获取对应的Base64编码。整个过程确保所有数据都能被编码,并且编码后的文本只使用65个字符(A~Z, a~z, 0~9, +, /, =)表示。
python中的base64模块的使用
import base64 str_="xiaoyu安全" # 加密实现 def enbase64(str_): return base64.b64encode(str_.encode('utf-8')).decode("utf-8") # 解密实现 def debase64(str_): # 注意:这里不需要再次将str_转换为utf-8,因为它已经是一个utf-8编码的字符串了 # 我们只需要将base64编码的部分解码回原始的bytes,然后再解码为utf-8字符串 return base64.b64decode(str_).decode('utf-8') if __name__ == '__main__': str_='xiaoyu安全' en=enbase64(str_) print('base64加密后的结果:',en) print('base64解密后:',debase64(en)) base64加密后的结果:eGlhb3l15a6J5YWo base64解密后:xiaoyu安全 4、md5(单向加密)MD5加密,即信息-摘要算法5(message-digest algorithm 5),能够将字符串、文件或压缩包等转换为固定长度为128bit的串。其主要用途包括:
加密注册用户的密码,保障用户信息安全;
网站用户上传图片或文件后,利用MD5值的唯一性作为文件名,便于管理和检索;
在key-value数据库中,使用MD5值作为key,提高数据存取效率;
比较两个文件是否相同,如下载资源时,网站提供的MD5值可用于检测文件完整性,确保文件未被篡改。
MD5模块在python3中被移除,在python3中使用hashlib模块进行md5加密操作。
import hashlib def md5(str_): str_=str_.encode('utf-8')# 将字符串进行字符编码 result = hashlib.md5(str_)# 将进行字符编码的str_再进行md5加密 # result.hexdigest()默认返回小写的加密结果:0d0a96fa021ccd3fac05df1a584e3185 # result.hexdigest().upper():返回大写的加密结果:0d0a96fa021ccd3fac05df1a584e3185 return result.hexdigest().upper() if __name__ == '__main__': str_ = 'hellow_world' print(md5(str_)) # 0d0a96fa021ccd3fac05df1a584e3185使用flask和md5实现登录接口
1、mysql
-- 创建表 create table t_user(id int auto_increment primary key,username varchar(50),password varchar(200)); -- 尝试添加数据,测试 insert into t_user values(default,'admin','123kkkk')2、python后端代码
from flask import Flask import hashlib import pymysql flask_app = Flask(__name__) def cur_sql(sql,username,password): # 创建连接 conn = pymysql.connect(database='demo', user='root', passwd='123456', port=3306, host='localhost') # 获取游标,执行sql语句 cur = conn.cursor() # 将sql语句预编译,防止sql注入 cur.execute(sql, (username, password)) data=cur.fetchall() # 关闭连接,释放内存 cur.close() conn.close() return data @flask_app.route('/add/<username>/<password>/') def user_add(username,password): try: # 将密码使用md5进行加密 password=hashlib.md5(password.encode()).hexdigest() # 要执行的sql语句 sql='insert into t_user values (default,%s,%s)' if not cur_sql(sql, username, password): return '用户添加失败' return '用户添加成功' except pymysql.MySQLError as e: return f'用户添加失败:{str(e)}' @flask_app.route('/login/<username>/<password>/') def user_login(username,password): try: password=hashlib.md5(password.encode()).hexdigest() sql='select * from t_user where username=%s and password=%s' # 添加数据 print(cur_sql(sql, username, password)) if not cur_sql(sql, username, password): return '登录失败' return '登录成功' except pymysql.MySQLError as e: return f'登录失败:{str(e)}'使用命令: flask --app main run 运行后端服务
测试结果如下:
添加一个admin用户,密码为admin123


使用正确密码

尝试sql注入,注入失败

这种单向加密只保证了数据库不显示明文,保证数据库数据的安全(md5不可逆),但是还是能够使用社工和密码字典进行密码爆破,建议使用的密码10位数字以上

SHA1,全称Secure Hash Algorithm(安全哈希算法),相较于MD5,其加密后的数据长度更长。对于长度小于2^64的任意输入,SHA1都能产生一个长度为160bit的散列值,这比MD5多出了32位。因此,SHA1在安全性上相较于MD5有所提升,但其运算速度则相对较慢。
from flask import Flask import hashlib import pymysql flask_app = Flask(__name__) @flask_app.route('/add/<username>/<password>/') def user_add(username,password): try: # 将密码使用sha1进行加密 password=hashlib.sha1(password.encode()).hexdigest() # 要执行的sql语句 sql='insert into t_user values (default,%s,%s)' cur_sql(sql,username,password) return '用户添加成功' except pymysql.MySQLError as e: return f'用户添加失败:{str(e)}'添加成功的数据库

secrets模块是Python 3.6引入的一个新内置模块,它专门用于生成密码强随机数,非常适合管理密码、账户验证信息、安全令牌以及相关的秘密信息。总的来说,secrets模块主要可以实现两大功能:
生成安全的随机数;
生成一个固定长度的随机字符串,这种字符串可以用作令牌或安全URL。
import secrets import string # 将所有的英文字母的大小写和数字进行组合 parm = string.ascii_letters + string.digits # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 password = ''.join(secrets.choice(parm) for i in range(10)) # 进行加密 print(password) # NdgdCDt13O生成包含安全令牌的URL
import secrets # 这里拿我自己的博客举例 url='https://xiaoyus.cc/update='+secrets.token_urlsafe() print(url)# https://xiaoyus.cc/update=1Peuz6HGhkhKSSQnmQtndCJ9GcEsRGFyyG-DFJdvazs这里就做个公益宣传吧

DES(Data Encryption Standard,数据加密标准)属于对称加密。对称加密,顾名思义,是指加密和解密的运算都是使用同样的密钥。DES算法是一种使用密钥加密的块算法,它将明文分成固定长度的块(通常为64位),并使用一个密钥(通常为56位有效密钥长度,因为最高位用作奇偶校验)对这些块进行加密。
安装:pip install pyDes 导入:from pyDes import des, CBC, PAD_PKCS5 from pyDes import des,CBC,PAD_PKCS5 import binascii # binascii 库在 Python 中主要用于二进制和 ASCII 码之间的转换。 key='xiaoyu13'# key必须为8个字节 def des_encrypt(s): ''' 将数据进行简单加密 :param s:原始字符串 :return: 加密后的字符串,16进制 ''' secret_key=key # 密码 iv=secret_key # 偏移量 # secret_key:加密密匙,CBC:加密模式,iv:偏移量,padmode:填充 des_obj=des(secret_key,CBC,iv,pad=None,padmode=PAD_PKCS5) # 返回为字节 secret_bytes=des_obj.encrypt(s,padmode=PAD_PKCS5)# b"\x14\xe1\xa2'\x83\x1e\xf3!\x8d\x9aks\xa5M\xe3\x81" return binascii.b2a_hex(secret_bytes) def des_decrypt(s): """ DES 解密 :param s: 加密后的字符串,16进制 :return: 解密后的字符串 """ secret_key = key iv = secret_key des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) result=des_obj.decrypt(binascii.a2b_hex(s),padmode=PAD_PKCS5) return result if __name__ == '__main__': print('加密后的结果:',des_encrypt('XIAOYU'))# 加密后的结果:b'ab498fe821d50739' print('解密后的结果:',des_decrypt(des_encrypt('XIAOYU'))) # 解密后的结果:b'XIAOYU'Tips:这个错误表示密匙key的字符长度必须为8个字节

AES加密,全称为高级加密标准(Advanced Encryption Standard),是一种广泛使用的对称加密算法。
AES算法由美国国家标准与技术研究院(NIST)于2001年发布,作为DES(数据加密标准)算法的替代方案。AES算法以其高强度、高速度和易于实现等优点,迅速成为对称密钥加密中最流行的算法之一。它被广泛用于保护各种敏感数据,如金融交易、在线通信、数据库加密等场景。
他的特点对称加密:AES是一种对称加密算法,意味着加密和解密过程使用相同的密钥。这种特性使得AES加密速度相对较快,尤其适用于大量数据的加密。
密钥长度:AES支持三种长度的密钥:128位、192位和256位。密钥长度越长,加密强度越高,但加密和解密过程也会相应变慢。
分组加密:AES采用分组加密的方式,每个明文块被独立加密成密文块。AES的标准分组长度为128位(即16字节)。
复杂操作:AES加密算法涉及四种基本操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。这些操作共同构成了AES加密的高强度特性。
案例
from Cryptodome.Cipher import AES from Cryptodome import Random data = 'XiaoYu安全' #密钥必须为16(AES-128),24,32 key = b'this is a 16 key' #生成长度等于AES块大小的不可重复的密钥向量 iv =Random.new().read(AES.block_size) print(iv) #使用key和Iv初始化AES对象 mycipher = AES.new(key,AES.MODE_CFB,iv) print(mycipher) cip = mycipher.encrypt(data.encode()) #将iv加到加密的密钥开头 ciptext =iv + cip print(ciptext) #解密需要 key和iv 生成AES对象,取前16位是iv mydecrypt = AES.new(key,AES.MODE_CFB,ciptext[:16]) #取后16位是密钥 decrytext = mydecrypt.decrypt(ciptext[16:]) print(decrytext.decode()) b'\x87\x10\xe2w\xb3oD\xd9\xbe\xe5\x02\xd4\xdcjk\xe7' <Cryptodome.Cipher._mode_cfb.CfbMode object at 0x0000000000FF7A90> b'\x87\x10\xe2w\xb3oD\xd9\xbe\xe5\x02\xd4\xdcjk\xe7\xdd\xf4\xe8\xba\xa0\xa3\xe4n\x0e\xb5Z\x90' XiaoYu安全 8、RSA加密RSA是一种公钥密码算法,全称为RSA加密算法,它属于非对称加密算法的一种。
基本概念定义:RSA加密算法是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年共同提出的。该算法的名称来源于这三位发明者姓氏的首字母组合。
特点:RSA算法使用一对密钥进行加密和解密操作,其中一个密钥是公钥(public key),用于加密数据;另一个是私钥(private key),用于解密数据。公钥可以公开,而私钥必须保密。
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP import binascii # 生成密钥对 key = RSA.generate(2048) private_key = key.export_key() public_key = key.publickey().export_key() # 要加密的消息 message = '你好, RSA!' message = message.encode() # 创建加密器并使用公钥加密 encryptor = PKCS1_OAEP.new(RSA.import_key(public_key)) encrypted = encryptor.encrypt(message) print("加密后:", binascii.hexlify(encrypted)) # 创建解密器并使用私钥解密 decryptor = PKCS1_OAEP.new(RSA.import_key(private_key)) decrypted = decryptor.decrypt(encrypted) print("解密后:", decrypted.decode()) 加密后: b'2103801e707e5011c9555bb8ad23eb317fabeead30fdf0c84a4c2abfdedb02b2c4a40a1d04aeaa344e30ede1580ae3d1154110215a5aa9c56a7e3315028ce35b4144b1691125573b978867d21b7d7068f3f0d683535b3c958119a95cdd320cc7daf82d2690c7f2d14765b6c9d2036d188a8d50121c7e8b8c64eb2660a5262836ea2b65e42010f601e57f605264ebe1130ab64a6d9a50e766f6d6a40b705980c7c046e8f0a8236bf5dea18fecb1b2a9eac6613d9f666d74c0de0683955ca097001a7ac5e27513d2341706e3fb71d5befc57ee71d2b41880ae23c44c2a57559c38371001b1a6e1874c0793cee990c41701aa9256650de79250236e89d61b484' 解密后: 你好, RSA! 一、加密方式对称加密
使用同一个密钥进行加密和解密,速度快,适合加密大量数据。
常见算法包括DES(已认为不安全)、3DES、AES(广泛使用的对称加密算法)。
非对称加密
使用一对密钥(公钥和私钥)进行加密和解密,公钥可公开,私钥保密。
常见算法包括RSA(应用广泛)、ECC(适用于资源有限的场景)、DSA(适用于数字签名)。
单向加密(不可逆加密)
通过散列算法将明文生成固定长度的散列值,无法从散列值还原原文。
常见算法包括MD5(已不安全)、SHA-1(较安全但速度较慢)、SHA-2(安全性更高)、HMAC(带密钥的散列消息认证码)。
二、Python中的应用Base64编码
将二进制数据转换为ASCII字符串,常用于文本数据的编码和解码。
MD5和SHA-1加密
用于生成数据的散列值,常用于密码存储、文件完整性验证等场景。
在Python中,通过hashlib模块实现。
Secrets模块
用于生成安全的随机数和随机字符串,适合生成密码、令牌等敏感信息。
DES加密
对称加密算法,使用固定长度的密钥加密数据块。
在Python中,可通过第三方库pyDes实现。
AES加密
对称加密算法,支持多种密钥长度(128位、192位、256位),广泛应用于敏感数据的加密。
在Python中,通过Cryptodome库实现。
RSA加密
非对称加密算法,使用公钥加密数据,私钥解密数据。
在Python中,通过pycryptodome库中的Crypto.PublicKey.RSA和Crypto.Cipher.PKCS1_OAEP模块实现。
三、实际应用案例用户注册和登录系统
使用MD5或SHA-1对用户密码进行单向加密存储,防止数据库泄露导致明文密码泄露。
通过Flask框架实现用户注册和登录接口,验证用户名和密码。
文件完整性验证
使用MD5或SHA-2生成文件的散列值,与网站提供的散列值进行比较,确保文件未被篡改。
安全令牌生成
使用secrets模块生成随机字符串,作为令牌或安全URL的一部分,提高系统的安全性。
总结本文介绍了常见的加密方式,包括对称加密、非对称加密和单向加密,并详细展示了在Python中如何使用这些加密技术。
零基础网络安全学习计划 学习路线图大纲总览
这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴文末免费领取哦,无偿分享!!!
【一一帮助网络安全学习,以下所有资源文末免费领取一一】
①网络安全学习路线
②上百份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥HW护网行动经验总结
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析
接下来我将给各位同学划分一张学习计划表!
学习计划那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:
接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。
综合薪资区间6k~15k
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

综合薪资区间15k~30k
7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。
零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;
Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完
用Python编写漏洞的exp,然后写一个简单的网络爬虫
PHP基本语法学习并书写一个简单的博客系统
熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)
了解Bootstrap的布局或者CSS。
阶段三:顶级网络安全工程师这部分内容对于咱们零基础的同学来说还太过遥远了,由于篇幅问题就不展开细说了,我给大家贴一个学习路线。感兴趣的童鞋可以自行研究一下哦,当然你也可以点击这里加我与我一起互相探讨、交流、咨询哦。


上述这份完整版的网络安全学习资料已经上传网盘,朋友们如果需要可以微信扫描下方二维码 ↓↓↓ 或者 点击以下链接都可以领取
点击领取 《网络安全&黑客&入门进阶学习资源包》
