常见的爬虫算法

打印 上一主题 下一主题

主题 1532|帖子 1532|积分 4596

1.base64加密

base64是什么

Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“+”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后根据Base64的对应表,得到对应的编码数据。
当原始数据凑不敷三个字节时,编码效果中会使用额外的**符号“=”**来表现这种环境。
base64原理

每一个base64的字符会对应有一个索引值(0-63)


将you进行base64编码过程如下:


小于3个字符为一组的编码方式如:


ASCII表:


base64代码演示

加密过程

  1. # 将you进行加密
  2. import base64
  3. # 1.先将字符串编码成二进制
  4. data = 'you'.encode("utf-8")
  5. print(data)  # 打印结果:b'you'
  6. # 2.再将二进制编码成base64的二进制,再由二进制进行解码成字符串
  7. bs = base64.b64encode(data).decode('utf-8')
  8. print(bs)  # 打印结果:eW91
  9. # 3.如果不够4位加密,则换成等号
  10. data1 = 'y'.encode("utf-8")
  11. bs1 = base64.b64encode(data1).decode("utf-8")
  12. print(bs1)  # 打印结果:eQ==
复制代码
解密过程

  1. # 将eW91进行解密
  2. import base64
  3. data = 'eW91'
  4. bs1 = base64.b64decode(data).decode()
  5. print(bs1)
  6. data1 = 'eW91eQ=='
  7. bs2 = base64.b64decode(data1).decode()
  8. print(bs1)
  9. # 必须是4的倍数
  10. s = "eW91eQ"
  11. # 填充为4的倍数
  12. s += ("=" * (4 - len(s) % 4))
  13. print("填充后", s)
  14. ret = base64.b64decode(s).decode()
  15. print(ret)
复制代码
js常见的加密方式



  • 加密在前端开发和爬虫中是经常遇见的。把握了加密、解密算法也是你从一个编程小白到大神级别质的一个飞跃。且加密算法的纯熟和剖析也是很有助于帮助我们实现高效的js逆向。下述只把我们常用的加密方法进行总结。不去深究加密的具体实现方式。
  • 常见的加密算法基本分为这几类,

    • 线性散列算法(署名算法)MD5
    • 对称性加密算法 AES DES
    • 非对称性加密算法 RSA

2.Md5加密(不可逆)



  • MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)的数据。

    • 结论:一旦看到了一个长度为32位的密文数据,该数据极有可能是通过md5算法进行的加密!

  • 解密:

    • 通例讲MD5是不存在解密的。但是理论上MD5是可以进行反向暴力破解的。暴力破解的大致原理就是用很多不同的数据进行加密后跟已有的加密数据进行对比,由此来寻找规律。理论上只要数据量充足庞大MD5是可以被破解的。但是要留意,破解MD5是需要思量破解的本钱(时间和机器性能)。假设破解当前的MD5暗码需要目前盘算能力最良好的盘算机工作100年才能破解完成。那么当前的MD5暗码就是安全的。

  • 增长破解本钱的方法(方法很多,这里只说我常用的)。

    • 使用一段无意义且随机的私匙进行MD5加密会生成一个加密串,我们暂且称之为串1
    • 将要加密的的数据跟串1拼接,再进行一次MD5,这时会生成串2
    • 将串2再次进行MD5加密,这时生成的串3就是我们加密后的数据。

  • 我们在注册账号时的暗码一般都是用的MD5加密。
Python中使用MD5加密

  1. from hashlib import md5
  2. obj = md5()
  3. obj.update("bobo".encode("utf-8"))
  4. bs = obj.hexdigest()
  5. print(bs)
复制代码
JS中使用MD5加密



  • JS版本:下载安装crypto-js(npm install crypto-js)
  • 前提要安装node.js
    1. var CryptoJS = require('crypto-js');
    2. // 原始数据
    3. var data = '123456';
    4. // 生成MD5摘要
    5. var md5Digest = CryptoJS.MD5(data).toString();
    6. console.log(md5Digest);
    复制代码
3.DES/AES加密(可逆)



  • DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的算法。该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的密钥(一组字符串)即可。
  • 留意:

    • 现在用AES这个标准来替换原先的DES。
    • AES和DES的区别:

      • 加密后密文长度的不同:

        • DES加密后密文长度是8的整数倍
        • AES加密后密文长度是16的整数倍

      • 应用场景的不同:

        • 企业级开发使用DES充足安全
        • 如果要求高使用AES



  • DES算法的入口参数有三个:

    • Key、Data、Mode,padding、iv。

      • Key为DES算法的工作密钥;
      • Data为要被加密或被解密的数据;
      • Mode为DES的工作模式。最常用的模式就是 CBC 模式和 ECB模式

        • ECB:是一种底子的加密方式,密文被分割身分组长度相称的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
        • CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或后再加密,这样做的目的是加强破解难度。

      • padding为添补模式,如果加密后密文长度如果达不到指定整数倍(8个字节、16个字节),添补对应字符
      • iv:参数中的iv主要用于CBC模式,确保即使加密相同的明文,每次产生的密文也不相同,加强加密的安全性。iv通常是一个16字节的随机字符串。这个字符串在解密时也需要用到,因此需要妥善生存。


  • Python版本:

    • 环境安装:
      1. pip install pycryptodome
      复制代码

python加密代码:

  1. ```
  2. from Crypto.Cipher import AES
  3. from Crypto.Util.Padding import pad
  4. import base64
  5. import os
  6. key_value = os.getenv('KEY')
  7. key = '0123456789abcdef'.encode()  # 秘钥: 必须16字节
  8. iv = b'abcdabcdabcdabcd'  # 偏移量:16位/字节(字节类型)
  9. text = 'alex is a monkey!'  # 加密内容
  10. # 设置加密内容的长度填充(位数为16的整数倍)
  11. text = pad(text.encode(), 16)
  12. # 创建加密对象
  13. aes = AES.new(key, AES.MODE_CBC, iv)  # 创建一个aes对象
  14. en_text = aes.encrypt(text)  # 加密明文
  15. print("aes加密数据:::", en_text)  # 返回二进制类型数据
  16. # 二进制密文转换成字符串格式
  17. en_text = base64.b64encode(en_text).decode()  # 将返回的字节型数据转进行base64编码
  18. print(en_text)
  19. ```
复制代码
python解密

  1. ```
  2. from Crypto.Cipher import AES
  3. import base64
  4. from Crypto.Util.Padding import unpad
  5. key = '0123456789abcdef'.encode()
  6. iv = b'abcdabcdabcdabcd'
  7. aes = AES.new(key, AES.MODE_CBC, iv)
  8. # 需要解密的文本
  9. text = 'X/A0fy9S7+kUI3HYQRKO46WTlid6T1DBhXutwmPdboY='.encode()
  10. # 将密文数据转换为二进制类型
  11. ecrypted_base64 = base64.b64decode(text)
  12. source = aes.decrypt(ecrypted_base64)  # 解密
  13. # 未填充数据
  14. print("aes解密数据:::", source.decode())
  15. # 取消填充数据
  16. print("aes解密数据:::", unpad(source, 16).decode())
  17. ```
复制代码
js加密

  1. const CryptoJS = require("crypto-js")
  2. // 密钥(128位,16字节)
  3. var key = CryptoJS.enc.Utf8.parse('0123456789abcdef');
  4. // 初始化向量(IV)(128位,16字节)
  5. var iv = CryptoJS.enc.Utf8.parse('1234567890abcdef');
  6. // 待加密的数据
  7. var plaintext = 'Hello, bobo!';
  8. // 进行AES-128加密,使用CBC模式和PKCS7填充
  9. var encrypted = CryptoJS.AES.encrypt(plaintext, key, {
  10.     iv: iv,
  11.     mode: CryptoJS.mode.CBC,
  12.     padding: CryptoJS.pad.Pkcs7
  13. });
  14. // 获取加密后的密文
  15. var ciphertext = encrypted.toString();
  16. console.log(ciphertext);
复制代码
js解密

  1. const CryptoJS = require("crypto-js")
  2. // 密钥(128位,16字节)
  3. var key = CryptoJS.enc.Utf8.parse('0123456789abcdef');
  4. // 初始化向量(IV)(128位,16字节)
  5. var iv = CryptoJS.enc.Utf8.parse('1234567890abcdef');
  6. // 密文数据
  7. var encrypText = 'GYc9oxlZB/PeyfFG3ppK6Q==';
  8. // 进行加密,使用CBC模式和PKCS7填充
  9. var decrypted = CryptoJS.AES.decrypt(encrypText, key, {
  10.     iv: iv,
  11.     mode: CryptoJS.mode.CBC,
  12.     padding: CryptoJS.pad.Pkcs7
  13. });
  14. // 解密
  15. var plaintext = decrypted.toString(CryptoJS.enc.Utf8);
  16. console.log(plaintext);
复制代码
4.RSA加密(可逆)



  • RSA加密:

    • RSA加密算法是一种非对称加密算法。在公开密钥加密和电子贸易中RSA被广泛使用。

  • 非对称加密算法:

    • 非对称加密算法需要两个密钥:

      • 公开密钥(publickey:简称公钥)== 数据加密
      • 私有密钥(privatekey:简称私钥)==数据解密
      • 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。


  • 留意:

    • 使用时都是使用公匙加密使用私匙解密。公匙可以公开,私匙自己生存。
    • 算法强度复杂、安全性依靠于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。

  • 使用流程和场景介绍

    • 通过公匙加密,使用私匙解密。私匙是通过公匙盘算生成的。假设ABC三方之间相互要进行加密通讯。大家相互之间使用公匙进行信息加密,信息读取时使用各自对应的私匙进行信息解密
    • 用户输入的支付暗码会通过RSA加密

  • 公钥私钥生成方式:

    • 公私匙可以在线生成

      • http://web.chacuo.net/netrsakeypair


  • 环境安装:npm install jsencrypt
js加密、解密

  1. window = globalThis;
  2. const JSEncrypt = require('jsencrypt');
  3. var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBJ6kZ/VFJYTV3vOC07jqWIqgyvHulv6us/8wzlSBqQ2+eOTX7s5zKfXY40yZWDoCaIGk+tP/sc0D6dQzjaxECAwEAAQ==-----END PUBLIC KEY-----';
  4.         //私钥
  5. var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvIEnqRn9UUlhNXe84LTuOpYiqDK8e6W/q6z/zDOVIGpDb545NfuznMp9djjTJlYOgJogaT60/+xzQPp1DONrEQIDAQABAkEAu7DFsqQEDDnKJpiwYfUE9ySiIWNTNLJWZDN/Bu2dYIV4DO2A5aHZfMe48rga5BkoWq2LALlY3tqsOFTe3M6yoQIhAOSfSAU3H6jIOnlEiZabUrVGqiFLCb5Ut3Jz9NN+5p59AiEA0xQDMrxWBBJ9BYq6RRY4pXwa/MthX/8Hy+3GnvNw/yUCIG/3Ee578KVYakq5pih8KSVeVjO37C2qj60d3Ok3XPqBAiEAqGPvxTsAuBDz0kcBIPqASGzArumljkrLsoHHkakOfU0CIDuhxKQwHlXFDO79ppYAPcVO3bph672qGD84YUaHF+pQ-----END PRIVATE KEY-----';
  6. //使用公钥加密
  7. var encrypt = new JSEncrypt();//实例化加密对象
  8. encrypt.setPublicKey(PUBLIC_KEY);//设置公钥
  9. var encrypted = encrypt.encrypt('hello bobo!');//对指定数据进行加密
  10. console.log(encrypted);//使用私钥解密
  11. // 使用私钥解密
  12. var decrypt = new JSEncrypt();
  13. decrypt.setPrivateKey(PRIVATE_KEY);//设置私钥
  14. var uncrypted = decrypt.decrypt(encrypted);//解密
  15. console.log(uncrypted);
复制代码
python中RSA创建公钥、私钥

  1. from Crypto.PublicKey import RSA
  2. # 通过相关算法生成唯一秘钥,生成密钥对
  3. rsakey = RSA.generate(1024)
  4. # 将秘钥保存到文件中
  5. with open("rsa.public.pem", mode="wb") as f:
  6.     # 公钥:rsa.public.pem
  7.     f.write(rsakey.publickey().exportKey())
  8. with open("rsa.private.pem", mode="wb") as f:
  9.     # 私钥:rsa.private.pem
  10.     f.write(rsakey.exportKey())
复制代码
python中RSA加密

  1. from Crypto.PublicKey import RSA
  2. from Crypto.Cipher import PKCS1_v1_5
  3. import base64
  4. # 加密
  5. data = "我喜欢你"
  6. with open("rsa.public.pem", mode="r") as f:
  7.     pk = f.read()
  8.     rsa_pk = RSA.importKey(pk)
  9.     # 基于公钥创建加密对象
  10.     rsa = PKCS1_v1_5.new(rsa_pk)
  11.     result = rsa.encrypt(data.encode("utf-8"))
  12.     # 处理成b64方便传输
  13.     b64_result = base64.b64encode(result).decode("utf-8")
  14.     print(b64_result)
复制代码
python中RSA解密

  1. from Crypto.PublicKey import RSA
  2. from Crypto.Cipher import PKCS1_v1_5
  3. import base64
  4. data = 'IIw+I9D3YhccQDBpH6mwmPT5MExW7NUlrrcrXaEEBF54NYPVfaV5Mb+ps3CCictOiCZMv4jSETZp6H1b3tW3FwHFCojxtFnMSn/RpH0HTfFrJQm7yVwF+qoQQqz8Fj5/qdQk2ejruXkvK21CYwl1REiFY1+1Req4WMChRB1bWuw='
  5. # 解密
  6. with open("rsa.private.pem", mode="r") as f:
  7.     prikey = f.read()
  8.     rsa_pk = RSA.importKey(prikey)
  9.     # 创建解密对象
  10.     rsa = PKCS1_v1_5.new(rsa_pk)
  11.     result = rsa.decrypt(base64.b64decode(data), None)
  12.     print("rsa解密数据:::", result.decode("utf-8"))
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表