爬虫類と反爬虫類、暗号化アルゴリズム


回転:http://www.cnblogs.com/woaixuexi9999/p/9392964.html 爬虫類と反爬虫類、暗号化アルゴリズムネットワーク爬虫類ネットワーク爬虫類は、自動的にホームページを抽出するプログラムであり、検索エンジンのために万次元のネット上からホームページをダウンロードし、検索エンジンの重要な構成である.しかし、ネット上の爬虫類が乱用されると、インターネットには同質なものが多く現れ、オリジナルは保護されない.そこで、多くのサイトが反ネット爬虫類を始め、自分の内容を守ろうとした.彼らはipアクセス頻度、Web閲覧速度、アカウント登録、認証コードの入力、flashパッケージ、ajax混同、js暗号化、画像などの技術に基づいて、ネットワーク爬虫類に対応しています.防ぐ側はコストを惜しまず、捕まえる側にコスト効果を考慮して放棄させる.つかむ側はコストを惜しまず、防ぐ側はユーザーの流失を考慮して放棄する.
一般的なリバース戦略の知識点1:User-Agent+Referer検出User-AgentはHTTPプロトコルのフィールドであり、その役割はHTTP要求を発行する端末のいくつかの情報を記述することである.サーバは、お客様が使用するオペレーティングシステムおよびバージョン、CPUタイプ、ブラウザおよびバージョン、ブラウザレンダリングエンジン、ブラウザ言語、ブラウザプラグインなどを識別できます.サーバは、このフィールドを使用して、Webサイトにアクセスしている人を知ることができます.通常のブラウザではないユーザーに対してマスクを行います.
解決策:ブラウザごとにUser-Agentが異なり、すべてのユーザーがブラウザを使用できるため、ブラウザのUser-Agentを偽装します.要求されるたびに条件付きブラウザのUser-Agentは、UA検出を解決することができます.
Refererはheaderの一部で、ブラウザがwebサーバにリクエストを送信すると、どのページからリンクしてきたのかをサーバに伝えるのが一般的です.例えば、いくつかの画像サイトでは、画像を要求すると、Referの値が検出され、Referが一致しなければ、正常な画像に戻りません.
ソリューション:referを検出する要求で、一致するrefer値を携帯します.
知識点2:js混同とレンダリングいわゆるJavaScript混同、基本は:1.実際に呼び出されていない関数をいくつか削除することです.2.分散した変数を連結に宣言します.3.論理関数の簡略化.4.変数名の簡略化.具体的には異なる圧縮ツールの考慮の優劣を見なければならない.よくあるのはUglifyJS、Jscramblerなどのツールです.
jsレンダリングとは、HTMLページの変更です.例えば、一部のページ自体がデータを返していない場合、データはjsロードされてHTMLに追加されます.このような場合、爬虫類はJavaScript操作を実行しないことを知っておく必要があります.だから他の方法で処理する必要があります.
ソリューション:1.Webサイトjsのソースコードを読むことで、重要なコードを見つけ、pythonで実現します.2.サイトjsのソースコードを読むことで、重要なコードを見つけ、PyV 8などのライブラリで直接jsコードを実行します.3.seleniumライブラリを使用してブラウザ環境を直接シミュレートします.
知識点3:IP制限頻度WEBシステムはhttpプロトコルを介してWEBコンテナと連通しており、要求されるたびに少なくとも1回クライアントとサーバのtcp接続が発生する.サービス側にとって、1つのipアドレスが単位時間内に開始された要求が明確に表示される.要求数が一定の値を超えると、異常なユーザ要求と判断される.
ソリューション:1.ipエージェントプールを独自に設計し、交代方式で、毎回異なるエージェントアドレスの携帯を要求する.2.ADSLダイナミックダイヤルには独自の特徴があり、ダイヤルするたびに新しいIPを取得します.つまり、IPは固定されていません.
知識点4:認証コード検証コード(CAPTCHA)は「Completely Automated Public Turing tell Computers and Humans Apart」(全自動区分コンピュータと人間の霊感テスト)の略で、ユーザーがコンピュータか人間かを区別する共通の全自動プログラムである.防止することができます:悪意を持ってパスワードを解読して、切符を塗って、フォーラムの灌水、有効にあるハッカーがある特定の登録ユーザーに対して特定のプログラムで暴力的に解読する方式で絶えず上陸する試みを行うことを防止します.この問題はコンピュータによって生成され、評価することができるが、人間だけが解答しなければならない.コンピュータはCAPTCHAの問題を解くことができないので,質問に答えたユーザは人間とみなすことができる.
ソリューション:1.手動で認証コードを識別する2.pytesseractは簡単な検証コードを識別する3.ドッキング打コードプラットフォーム
暗号化アルゴリズム暗号化アルゴリズムの概要によると、紀元前400年、古代ギリシャ人は置換暗号を発明した.1881年に世界初の電話秘密保持特許が登場した.第二次世界大戦中、ドイツ軍は「エンニグマ」暗号機を起用し、暗号学は戦争において非常に重要な役割を果たした.情報化とデジタル化社会の発展に伴い、人々の情報セキュリティと秘密保持の重要性に対する認識は絶えず高まっており、1997年、米国国家標準局が「米国データ暗号化標準(DES)」を公布・実施し、民間力が暗号学の研究と応用に全面的に介入し始め、採用した暗号化アルゴリズムにはDES、RSA、SHAなどがある.暗号化の強度に対する需要が高まるにつれて,最近AES,ECCなどが現れた.暗号学を用いることで、ユーザの識別やデータの読み取りを防止する機密性を達成することができる.データ整合性:データが変更されないようにします.認証:データが特定の側から送信されることを確認します.
暗号化アルゴリズム紹介暗号化アルゴリズム分類鍵タイプによって現代暗号技術を対称暗号化アルゴリズム(秘密鍵暗号化)と非対称暗号化アルゴリズム(公開鍵暗号化)の2種類に分類する.対称鍵暗号化システムは、暗号化と復号化に同じ秘密鍵を採用し、通信双方がこの鍵を取得し、鍵の秘密を保持しなければならない.非対称鍵暗号化システムで採用される暗号鍵(公開鍵)と復号鍵(秘密鍵)は異なる.
対称暗号化アルゴリズムは主にDES,3 DES,AESなどのアルゴリズムを含む.非対称暗号化アルゴリズムは主にRSA、DSA、ECCなどのアルゴリズムを含む
常用暗号化アルゴリズムDES:Data Encryption Standardと総称されるデータ暗号化規格であり、鍵を用いて暗号化されたブロックアルゴリズムのエントリパラメータは3つある:Key、Data、Mode Keyは7バイト計56ビットであり、DESアルゴリズムの作業鍵である.Dataは8バイト64ビットで、暗号化または復号化されるデータである.ModeはDESの動作方法で、暗号化または復号化の2種類があります.
3 DES(Triple DES)は、DESがAESに移行する暗号化アルゴリズムであり、2つの鍵を用いて3回のDESアルゴリズムを実行し、暗号化の過程は暗号化-復号化-暗号化復号化の過程は復号化-暗号化-復号化である
AES:
      (  :Advanced Encryption Standard,  :AES),           DES

AES        128   ,        128,192 256   (16、24 32  )

      :

1、    (KeyExpansion),

2、   (Initial Round),

3、   (Rounds),      :SubBytes、ShiftRows、MixColumns、AddRoundKey,

4、   (Final Round),     MixColumns。
RSA:
      ,         

    ,    

3   :

rsa_n, rsa_e,message

rsa_n, rsa_e        

message:        
python暗号化ライブラリPyCryptoはPythonで最も暗号学的に有名なサードパーティ製パッケージです.残念なことに、その開発作業は2012年に停止した.他の人はまだ最新バージョンのPyCryptoを発表し続けていますが、サードパーティのバイナリパッケージを使用することを気にしない場合は、Python 3.5の対応するバージョンを取得することができます.例えば、GithubでPython 3.5に対応するPyCryptoバイナリパッケージを見つけることができます.
幸いなことに、PyCryptoの代わりに、このプロジェクトのブランチPyCrytodomeがあります.Linuxにインストールするには、次のpipコマンドを使用します.
pip install pycryptodome
Windowsシステムでのインストールは少し異なります.
pip install pycryptodomex
ビット、コンピュータの中の0あるいは1です
コンピュータの最小記憶単位:バイト(byte)
1バイト8ビット(ビット)
binasciiライブラリ
a2b_hex:16進回転bytes
b2a_hex:bytes文字列を16進数に変換
a2b_base 64:ascii文字をバイナリに変換
b2a_base 64:バイナリをascii文字に変換
DES暗号化の例
from Cryptodome.Cipher import DES
import binascii

def pad(text):
    while len(text)%8 != 0: #  8   ,      8   
        text += ' '
    return text
または
def pad(text):
#     text = text.encode()
#     result = len(text) %8
#     if ( result != 0): #      8    , \0    
#         text = text + (b'\0'*(16-result))
#     return text

key = b'abcdefgh' #   ,   8  16 
des = DES.new(key,DES.MODE_ECB) #   key:   mode:     DES.MODE_ECB
text = 'hello world' #      
encrypto_text = des.encrypt(pad(text).encode()) #   
print('  ',binascii.b2a_hex(encrypto_text)) # bytes  16  
#      pad  ,    :       ,            (   8    )
data = des.decrypt(encrypto_text).rstrip() #          ,   rstrip  
print('  ',data)
密文b’c 720 e 6 acbf 9 f 18 b 072 b 2 abe 014 f 5 a 6 ce’明文b’hello world’
AES暗号化の例
from Cryptodome.Cipher import AES
from binascii import a2b_hex,b2a_hex

class aescrypt():
    def __init__(self,key):
        self.key = key.encode() #    
        self.mode = AES.MODE_ECB #    
        self.aes = AES.new(self.key,self.mode) #    aes  
        #          16、24 32,  16      

    def aesencrypt(self,text):
        #        ,    ,   16  
        # text = text.encode()
        # result = len(text) %16
        # if ( result != 0): #      16    , \0    
        #     text = text + (b'\0'*(16-result))
        # self.encrypt_text = self.aes.encrypt(text)
        while len(text) % 16 !=0: #             16   ,          16     
            text = text + ' '
        self.encrypt_text = self.aes.encrypt(text.encode())
        return b2a_hex(self.encrypt_text)

    def aesdecrypt(self,text):
        #         ,       ,       
        self.decrypt_text = self.aes.decrypt(a2b_hex(text))
        return self.decrypt_text.decode().rstrip(' ')

if __name__ == '__main__':
    pr = aescrypt('abcdefghabcdefgh')
    en_text = pr.aesencrypt('hello world')
    print('  :',en_text)
    de_text = pr.aesdecrypt(en_text)
    print('  :',de_text)
密文:b’10 ccb 47 c 783 a 235845 b 23 d 23 ce 68 c 4 f 2’明文:hello world
RSA暗号化の例
import rsa
from binascii import a2b_hex,b2a_hex

class rsacrypt():
    def __init__(self):
        self.pub_key,self.priv_key = rsa.newkeys(1024)#        

    def rsa_encrypt(self,text):
        self.encrypt_text = rsa.encrypt(text.encode(),self.pub_key)#    bytes
        return b2a_hex(self.encrypt_text) #   16    

    def rsa_decrypt(self,text):
        self.decrypt_text = rsa.decrypt(a2b_hex(text),self.priv_key) #  16      bytes,    
        return self.decrypt_text.decode()

if __name__ == '__main__':
    rs = rsacrypt()
    text = "hello world"
    en_text = rs.rsa_encrypt(text)
    print('  :',en_text)
    de_text = rs.rsa_decrypt(en_text)
    print('  :',de_text)
密文:b′0 ecaaa 6 c 11 e 95 d 1 f 720d 2 f 720d 4 d 80280 aa 3 f 288080072773 f 608 bbaa 2 c 80 ee 93 dfc 9 cbd 5 d 47 c 76134 c 6 fec 6 c 6 fec 26398807 b 0836 e 2211 fdb 28 eb 20 bee 2 d 676 ebb 2 c 37671 c 926 e 11109 aa 19 e 1 f 1 e 1 f 1 e 3 f 2 e 37 e 5218 b 045239088 a 4 a 4 d 4 a 4 a 4 a 278462691 ffeababbbd 02707 d 7 be 8 e 25 e 25 e 25 f 6 e 6 b 6 b 814 aab 814 aaa a 4 a 4 a 4 a 4 b b b 4 a 4 a 4 b 88 b 107 f 56 f 8 afbb 6 b 7 c 4 d 14 e 935280’明文:hello world
追加:
MD 5メッセージ要約アルゴリズム(英語:MD 5 Message-Digest Algorithm)は、広く使用されている暗号ハッシュ関数であり、情報伝送の完全な一貫性を確保するために128ビット(16バイト)のハッシュ値(hash value)を生成することができる.
import hashlib


s = 'hello world'
m = hashlib.md5()  #   
m.update(s.encode())  #        bytes  
print(m.hexdigest())  #     16    
5 eb 63 bbbe 01 eeed 093 cb 22 bb 8 f 5 acdc 3 Base 64は、ネットワーク上で最も一般的な8 Bitバイトコードを伝送するための符号化方式の1つであり、Base 64は、64個の印刷可能な文字に基づいてバイナリデータを表す方法である.
げんり
64文字でバイナリデータを表す方法
A-Z a-z 0-9 +/
3バイト(24ビット)のバイナリデータをつなぎ合わせ、6ビットごとに分割して4バイトにし、バイナリデータが3で割り切れない場合、残り1バイトは末尾に1個=、残り2バイトは末尾に2個=
トランスコード処理例:
38=46
メモリ1バイト8ビット
回転前:s 1 3
先にasciiに移行:115,49 51に対応
2進法:01110011 0010001 00100111
6つのグループ(4つのグループ)01110011001100010010011
そして後ろの011100 110011 000100 110011があります
それからコンピュータは8ビットの8ビットの存数の6が足りないので、自動的に2つの高位の0を補います
すべて高位補0があった
科学計算機入力00011100 0010011 00010010010010010011
28,514,51を得る
下照表c z E zを調べる
「迅雷ダウンロード」を例にとると、多くのダウンロード系サイトが「迅雷ダウンロード」のリンクを提供しており、そのアドレスは通常暗号化された迅雷専用ダウンロードアドレスである.
実は迅雷の「専用アドレス」もBase 64で「暗号化」されており、その過程は以下の通りである.
一、アドレスの前後にAAとZZをそれぞれ追加する
二、新しい文字列に対してBase 64符号化を行う
また、Flashgetは迅雷と似ていますが、最初のステップで追加した「材料」が異なるだけで、Flashgetがアドレスの前後に追加した「材料」は[FLASHGET]です.
QQ旋風のはいっそ材料を入れないで、直接住所に対してBase 64コードを行いました
実例
import base64

s = 'hello world'
r1 = base64.encodebytes(s.encode()) #  
print(r1) # 57      
r2 = base64.b64encode(s.encode()) #
, b64encode print(r2) data = base64.b64decode(r1) # print(data)
b’aGVsbG8gd29ybGQ=’ b’aGVsbG8gd29ybGQ=’ b’hello world’