パスワードの暗号化と復号化


  コンピュータソフトウェアの不正コピーにより、通信の漏洩やデータのセキュリティが脅かされています。一般に、セキュリティのために、データベース名、パスワード、およびその他の情報は暗号化する必要があります。したがって、暗号化は開発プロセスでよく使用されるテクノロジーであり、ログイン、支払い、oauth などのいくつかの重要なシナリオで適用されます。ビジネス目標を達成するには、シナリオごとに異なる署名暗号化アルゴリズムが必要です。プロジェクトでは python 側が使用され、パスワード用の python の暗号化および復号化モジュールが必要です。
  暗号化アルゴリズム 分散ハッシュ アルゴリズム、対称暗号化、非対称暗号化。オンライン情報を参照して、パスワード管理の論理的な考え方を事前に整理してください。

1. 対称暗号化

  暗号化と復号化に同じキーを使用するのは、この暗号化方式を使用する 2 つの当事者です。キーは、暗号化と復号化のプロセスを制御する命令です。アルゴリズムは、暗号化と復号化の実行方法を規定する一連の規則です。一般的な対称アルゴリズムには、AES、DES、3DES などがあります。

1.1 サードパーティ ライブラリのインストール - PyCrypto

  対称暗号化または非対称暗号化には、サードパーティ製のライブラリをインストールする必要があります.Python の暗号化ライブラリは PyCrypto ですが、2012 年に更新が停止され、現在は PyCrypto の代わりに PyCrytodome が使用されています.
  Windows に pycryptodemo をインストールし、Linux に pycrypto をインストールします。

pip install pycryptodome

例は次のとおりです。
1

1.2 暗号化の実装

  AES アルゴリズムは、現在最も広く使用されている暗号化アルゴリズムです。AES には、ECB、CBC、CTR、CFB、OFB という 5 つの暗号化モードがあります。例として AES の ECB モードを見てみましょう. AES も暗号化キー aes_key を必要とします. 暗号化されたデータが 16 または 32 ビット未満である場合, それはそれらの倍数である必要があることに注意してください. 16 の倍数は以下に例として使用します。

  1. 最初に関数を作成し、不完全なデータが 16 倍未満の場合
def addStrToSpecifyLen(s,specifyLen=0):
    """
    s不是specifyLen的倍数那就补足为specifyLen的倍数
    :param s: 需要加密的参数
    :param specifyLen: 指定参数的位数
    :return: 补足位数的参数
    """
    if specifyLen <= 0:
        specifyLen = 1;
    while len(s) % specifyLen != 0:
        s += '\0'
    return s.encode(encoding='utf-8')
  1. 暗号化アルゴリズム - aes
def encrypt_aes(text='', key=''):
    """
    aes的ecb模式加密
    :param data: 加密数据
    :param aes_key: 加密的秘钥
    :return: 加密之后的密文
    """
    # 初始化加密器
    aes = AES.new(addStrToSpecifyLen(key,16), AES.MODE_ECB)
    # 先进行aes加密
    encrypt = aes.encrypt(addStrToSpecifyLen(text,16))
    # 用base64转成字符串形式
    encrypted_text = str(base64.encodebytes(encrypt), encoding='utf-8')  # 执行加密并转码返回bytes
    return encrypted_text
  1. 復号化アルゴリズム
def decrypt_aes(data, aes_key):
    """
    aes的ecb模式解密
    :param data: 待解密数据
    :param aes_key: 加密的秘钥
    :return: 解密之后的数据
    """
    # 初始化加密器
    aes = AES.new(addStrToSpecifyLen(aes_key,16), AES.MODE_ECB)
    #优先逆向解密base64成bytes
    base64_decrypted = base64.decodebytes(addStrToSpecifyLen(data,16))
    #执行解密密并转码返回str
    decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','')
    return decrypted_text
  1. テスト出力は次のとおりです。
if __name__ == '__main__':
    key = '12223'
    data = 'test12dcds'
    encrypt = encrypt_aes(data,key)
    print(encrypt)
    print(decrypt_aes(encrypt,key))

2

2. 非対称暗号化

  対称暗号化アルゴリズムとは異なり、非対称暗号化アルゴリズムには、公開鍵 (publickey) と秘密鍵 (privatekey) の 2 つの鍵が必要です。公開鍵と秘密鍵はペアで、公開鍵でデータを暗号化した場合は対応する秘密鍵でしか復号化できず、秘密鍵でデータを暗号化した場合は対応する公開鍵でしか復号化できないデータの復号化に使用されます。暗号化と復号化には 2 つの異なるキーが使用されるため、このアルゴリズムは非対称暗号化アルゴリズムと呼ばれます。一般的な非対称アルゴリズムには、RSA、DSA、ECC などがあります。

3. 要約アルゴリズム

  Python の hashlib は、MD5、SHA1、SHA224、SHA256、SHA384、SHA512 およびその他のアルゴリズムなどの一般的なダイジェスト アルゴリズムを提供します。ダイジェスト アルゴリズムは、ハッシュ アルゴリズムまたはハッシュ アルゴリズムとも呼ばれます。関数を使用して、任意の長さのデータを固定長のデータ文字列 (通常は 16 進文字列で表されます) に変換します。
   一般に、ネットワーク通信におけるメッセージの暗号化に使用されます. 前提として、両者は最初に共同パスワードと同様に鍵に同意する必要があり、次にメッセージが送信されてメッセージが鍵で暗号化され、受信者はキー + メッセージの平文を再度暗号化し、暗号化された値の後に送信者の相対比率が等しいかどうかを入力することで、メッセージの真正性と送信者の正当性を検証できます。
   ダイジェスト アルゴリズムがデータの改ざんの有無を指摘できるのは、ダイジェスト関数が一方向性関数であるためです. f(データ) を計算するのは簡単ですが、ダイジェストによってデータを元に戻すことは非常に困難です. さらに、元のデータに少し変更を加えると、まったく異なる集計結果が得られます。ハッシュ アルゴリズムで暗号化されたデータは、通常、base64 エンコーディング形式を採用しています。一般的に使用されるハッシュ計算の例は次のとおりです。

3.1 MD5 暗号化

 これは最も一般的なダイジェスト アルゴリズムであり、非常に高速です。生成される結果は固定の 128 ビット バイトで、通常は 32 ビットの 16 進数文字列で表されます。

import hashlib
hash = hashlib.md5()
hash.update("mayi".encode("utf-8"))
# 7d1080e20427559fcc0a647826741f66
print(hash.hexdigest())

3.2 sha1 暗号化

 SHA1 の結果は 160 ビット バイトで、通常は 40 ビットの 16 進数文字列で表されます。

import hashlib
hash = hashlib.sha1()
hash.update("mayi".encode("utf-8"))
# c159ce3114fb4553683cf96d91db6d51080c02e8
print(hash.hexdigest())

3.3 sha256 暗号化

SHA1 より安全なアルゴリズムは SHA256 と SHA512 ですが、より安全なアルゴリズムは遅く、ダイジェストの長さが長くなります。

import hashlib
hash = hashlib.sha256()
hash.update("mayi".encode("utf-8"))
# 5dfae51e782cce2f213ef6bc89f75c9ab6c3bd8a5d1299a73191677cd5aa1f93
print(hash.hexdigest())

3.4 sha384 暗号化

import hashlib
hash = hashlib.sha384()
hash.update("mayi".encode("utf-8"))
# a1eb5c52e830d5ea4fdb0a3dc2241374f56426aebacd8890a69c7db57724788ec5047a005ecff4a23310b7f87035926f
print(hash.hexdigest())

3.5 sha512 暗号化

import hashlib
hash = hashlib.sha512()
hash.update("mayi".encode("utf-8"))
# 93102ec5658f739c060e3d82096e538ec116d0c9d6925119b465f0823be99697056518465cc6fe75265deb26632c8ce62b3d63a8782c492
daac2b9c03a89defe
print(hash.hexdigest())

3.6 「ソルト」暗号化

  上記の暗号化アルゴリズムは非常に強力ですが、認証によって元に戻すことができる欠陥がまだあります。そのため、暗号化アルゴリズムにカスタムキーを追加 (ユーザー名やランダムな文字を追加するなど) してから暗号化する必要があります。

import hashlib
hash = hashlib.md5('python'.encode('utf-8'))
hash.update("mayi".encode("utf-8"))
# b0758ad1aad20530044668775f389922
print(hash.hexdigest())

おすすめ

転載: blog.csdn.net/weixin_44462773/article/details/128854517