MySQL データベースで機密データの暗号化と復号化を実装する方法

MySQL データベースで機密データの暗号化と復号化を実装する方法

ビッグデータ時代の到来により、データは企業にとって最も重要な資産の 1 つとなり、データ暗号化もデータ資産を保護する重要な手段となっています。この記事では主に、MySQL 関数の学習と Python 暗号化方式を組み合わせて、データ暗号化のいくつかの簡単な方法を紹介します。

1. 準備

後続の比較を容易にするために、さまざまなタイプのデータ セットが異なるテーブルに保存されます。

元のプレーンテキストデータのテーブルを作成する

/* 元のデータテーブルを作成する */

 テーブル `f_user` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) デフォルト NULL,
 `tel` varchar(20) デフォルト NULL,
 `pwd` varchar(50) デフォルト NULL,
 主キー (`id`)
);
/* 新しい生データを追加 */
`f_user` に値 (1、'Cao Cao'、'10000000000'、'Cc@123')、(2、'Guan Yu'、'21000000000'、'Guanyu@21')、(3、'Liu Bei'、'20000000000'、'LB#200000') を挿入します。

MySQL 暗号化テーブルの作成

テーブル `f_user_m` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(200) デフォルト NULL,
 `tel` varchar(100) デフォルト NULL,
 `pwd` varbinary(255) デフォルト NULL,
 主キー (`id`)
);

Python 暗号化テーブルの作成

テーブル `f_user_p` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(200) デフォルト NULL,
 `tel` varchar(100) デフォルト NULL,
 `pwd` varchar(500) デフォルト NULL,
 主キー (`id`)
);

2. MySQL暗号化関数方式

2.1 MySQL 暗号化

プレーンテキスト テーブルのデータを f_user_m に挿入し、pwd パスワード フィールドを暗号化して保存します。暗号化された文字列は復号化時に使用されるため、覚えておいてください。

/* 暗号化されたパスワードフィールド */
mysql> f_user_m に挿入 (名前、電話番号、パスワード) 
f_user から name、tel、AES_ENCRYPT(pwd、'MySQL') を選択します。
クエリは正常、3 行が影響を受けました (0.00 秒)
記録: 3 重複: 0 警告: 0

保存された結果は次のとおりです

注記:

暗号化されたデータが varchar 型フィールドに直接保存されると、次のエラーが発生します。

エラー 1366 (HY000): 行 1 の列 'pwd' の文字列値が正しくありません: '\xF0K+!\x15?...'

これを処理するには 3 つの方法があります。

1) 暗号化されたデータは、utf8文字セットのvarbinary/binary/blobなどのバイナリフィールドに保存する必要があるため、上記のテキストのパスワードフィールドの型はvarbinary型に設定されています。

2) HEX() 関数を使用して、暗号化されたデータを 16 進形式に変換して保存できます。データを取得するときは、復号化する前に UNHEX() を使用して処理します。

3) latin1文字セットを使用してvarchar型フィールドに直接保存しますが、推奨されません。

自分でテストして処理する方法は 3 つあります。

2.2 MYSQL 復号化

暗号化されたデータの場合は、MySQLの復号化関数AES_DECRYPTを使用して、プレーンテキストを復号化して表示することができます。

mysql> f_user_m から name、tel、AES_DECRYPT(pwd、'MySQL')pwd を選択します。 
+--------+-------------+------------+
| 名前 | 電話番号 | パスワード |
+--------+-------------+------------+
| 曹操 | 10000000000 | Cc@123 |
| 関羽| 210000000000 | 関羽@21 |
| 劉備 | 20000000000 | LB#200000 |
+--------+-------------+------------+
セット内の 3 行 (0.00 秒)

この時点で表示されるデータはプレーンテキスト テーブルと一致しています。

3. Pythonのbase64暗号化方式

3.1 Pythonのencodestringメソッドを使った暗号化

データを暗号化してテーブルに挿入するPythonスクリプトを書く

#!/usr/bin/python
# コーディング=utf-8
pymysql を mdb としてインポートする
base64をインポート
sor_conn = mdb.connect(ホスト='127.0.0.1'、ポート=3306、ユーザー='root'、パスワード='Root@Py123')
sor_cur = sor_conn.cursor()
v_sql = "bak_db.f_user から名前、電話番号、パスワードを選択"
result_tb = sor_cur.execute(v_sql)
t = sor_cur.fetchall()
tの列の場合:
  v_name = 列[0]
  v_tel = 列[1]
  v_pwd = 列[2]
  v_pwd = base64.encodestring(v_pwd) # 暗号化 v_sql_insert = "insert into bak_db.f_user_p(name,tel,pwd) values('%s','%s','%s');" %(v_name,v_tel,v_pwd)
  sor_cur.execute(v_sql_insert)
  sor_conn.コミット()
sor_conn.close()

暗号化されたデータは次のとおりです。

/* 暗号化されたデータは次のとおりです*/
mysql> f_user_p から * を選択します。
+----+--------+-------------+---------------+
| ID | 名前 | 電話番号 | パスワード |
+----+--------+-------------+---------------+
| 1 | 曹操 | 10000000000 | Q2NAMTIz
  |
| 2 | 関羽 | 21000000000 | R3Vhbnl1QDIx
 |
| 3 | 劉備 | 20000000000 | TEIjMjAwMDAw
 |
+----+--------+-------------+---------------+
セット内の 3 行 (0.00 秒)

3.2 Pythonのdecodestringメソッドを使用した復号化

復号化方法は、比較的簡単で自分でテストできる base64.decodestring メソッドを使用します。

注意:この方法では暗号化と復号化に暗号化文字列を使用しないため、セキュリティは比較的低くなります。そのため、引き続き別の方法を使用できます。

4. Python AESアルゴリズム暗号化

AES アルゴリズムには Crypto.Cipher モジュールが必要です。この方法は MySQL の方法に似ています。暗号化文字列をカスタマイズでき、対応する暗号化文字列が復号化中に使用される可能性があるため、比較的安全です。

使用する前にCryptoをインストールする必要があります

pip インストール 暗号

テスト手順は次のとおりです。

#!/usr/bin/python
# コーディング=utf-8
Crypto.CipherからAESをインポート
pymysql を mdb としてインポートする
binascii から b2a_hex、a2b_hex をインポートします
インポートシステム
sor_conn = mdb.connect(ホスト='127.0.0.1'、ポート=3306、ユーザー='root'、パスワード='Root@Py123')
sor_cur = sor_conn.cursor()
クラス PyDbString():
  __init__(self)を定義します。
    自己キー = 'pythonkey2020320'
    自己モード = AES.MODE_CBC
  def addString(self, テキスト):
    暗号化キー = AES.new(self.key, self.mode, self.key)
    長さ = 32
    count = len(テキスト)
    追加 = 長さ - (カウント % 長さ)
    テキスト = テキスト + ('\0' * 追加)
    self.ciphertext = cryptor.encrypt(テキスト)
    b2a_hex(self.ciphertext) を返す
  desString(self, テキスト):
    暗号化キー = AES.new(self.key, self.mode, self.key)
    プレーンテキスト = cryptor.decrypt(a2b_hex(テキスト))
    plain_text.rstrip('\0') を返します
v_strpass = PyDbString()
v_sql = "bak_db.f_user から名前、電話番号、パスワードを選択"
result_tb = sor_cur.execute(v_sql)
t = sor_cur.fetchall()
tの列の場合:
  v_name = 列[0]
  v_tel = 列[1]
  v_pwd = 列[2]
  印刷(v_pwd)
  v_pwd = v_strpass.addString(v_pwd) # 暗号化 v_sql_insert = "insert into bak_db.f_user_p(name,tel,pwd) values('%s','%s','%s');" %(v_name,v_tel,v_pwd)
  sor_cur.execute(v_sql_insert)
  sor_conn.コミット()
sor_conn.close()

次のようにデータを表示します。

復号化方法は、上記の例の addstring を desString に変更することです。

上記の 3 つの方法は、データの暗号化と復号化に使用されます。個人的には、アプリケーション層からのカスタム暗号化である 3 番目の方法をお勧めします。また、この方法は暗号化のみです。実際のアプリケーションでは、データのセキュリティを確保するために、暗号化、難読化、その他の感度を下げる方法が必要になる場合があります。また、多くの場合、復号化方法はありません。つまり、元に戻すことはできません。ご興味がございましたら、ご連絡ください。ありがとうございます!

要約する

これで、MySQL データベースで機密データの暗号化と復号化を実装する方法に関するこの記事は終了です。MySQL データの暗号化と復号化に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL データベースの一般的な基本操作の分析 [データベースの作成、表示、変更、削除]
  • Django で MySQL データベースから echarts にデータを取得する方法
  • Pycharm ツールが MySQL データベースに接続できませんでした
  • Pythonでpymysqlを使用して、mysqlデータベースにデータを挿入する
  • Python3.6 の MySQL データベースへの接続、追加、削除、変更、クエリ操作の詳細な説明
  • MySQL データベースのエンコーディングを utf8mb4 に変更する方法
  • MySQL データベース設計 3 つのパラダイム例分析

<<:  JavaScriptはスライダーを介してWebページの色を変更することを実装します

>>:  重複リクエストを削除するAxiosのソリューションについての簡単な説明

推薦する

Dockerはコンテナに入るためにルートを使用する

まずdockerコンテナを実行しますルートユーザーとしてコマンドを実行する sudo docker ...

CSSのborder-radiusプロパティを使用して円弧を設定します

現象: divを一定の振幅で円、楕円などに変更する方法: CSSのborder-radiusプロパテ...

Unicode の一般的な文字の概要

初期のコンピューターのほとんどは ASCII 文字しか使用できませんでしたが、その後、主要な西洋のア...

MySQL でのトランザクションの使用方法

基礎トランザクションは、SQL ステートメントのグループに対するアトミック操作です。つまり、グループ...

フォーム送信の更新ページはソースコード設計にジャンプしません

1. ソースコードの設計コードをコピーコードは次のとおりです。 <!DOCTYPE html ...

MySQLトランザクションが効率に与える影響の分析と概要

1. データベース トランザクションによりデータベースのパフォーマンスが低下します。データの一貫性と...

フレックスレイアウトでコンテナ内のコンテンツを維持するためのソリューションの詳細な説明

モバイル側では、フレックスレイアウトが非常に便利です。デバイスの幅に応じてコンテナの幅を自動的に調整...

基礎知識: ウェブサイトのアドレスの前の http はどういう意味ですか?

HTTPとは何ですか?ウェブサイトを閲覧したいときは、ブラウザのアドレス バーにウェブサイトのアド...

Linux での fuser コマンドの使用法の詳細な説明

説明する: fuser は、現在ディスク上のファイル、マウント ポイント、さらにはネットワーク ポー...

JavaScript 関数型プログラミングの基礎

目次1. はじめに2. 関数型プログラミングとは何ですか? 3. 純粋関数(関数型プログラミングの基...

Nginx+Tomcat 負荷分散クラスタのインストールと構成のケースの詳細な説明

目次序文1. Nginx+Tomcat 2. Nginxサーバーを構成する3. Tomcatアプリケ...

WebpackはTypeScriptコードをパッケージ化するためのスキャフォールディングを構築します

フォルダを作成するディレクトリ構造: dabaots npm init -yを初期化して packa...

Dockerの動作モードと原理の詳細な説明

次の図に示すように: 仮想マシンと Docker を使用するとき、「なぜ Docker は VM よ...

js はランダムロールコールを実装します

この記事では、ランダムロールコールを実装するためのjsの具体的なコードを参考までに共有します。具体的...

MySQLはテーブルデータを復元するためにfrmファイルとibdファイルを使用します

目次frm ファイルと ibd ファイルの紹介frm ファイル回復テーブル構造ibd ファイル回復テ...