ビッグデータ時代の到来により、データは企業にとって最も重要な資産の 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 型フィールドに直接保存されると、次のエラーが発生します。
これを処理するには 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をインストールする必要があります
テスト手順は次のとおりです。 #!/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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: JavaScriptはスライダーを介してWebページの色を変更することを実装します
>>: 重複リクエストを削除するAxiosのソリューションについての簡単な説明
派生テーブルについてメイン クエリに派生テーブルが含まれている場合、または SELECT ステートメ...
MySQL を使用する際、フィールドをソートしたりクエリしたりすることがよくあります。通常は、中国語...
Windows インストール mysql-5.7.17-winx64.zip メソッド レコード &...
目次1. 終了2. クロージャの使用シナリオ1.タイムアウトを設定する2. コールバック3. 手ぶれ...
フレックスレイアウトを使用すると、9つの正方形のグリッドであれば、図に示すように均等に分割できます。...
MySQL ウィンドウ関数の紹介MySQL は MySQL 8.0 以降、ウィンドウ関数をサポートし...
メニューバーの例 1: コードをコピーコードは次のとおりです。 <!DOCTYPE html ...
1. CSSは左の固定幅と右の適応幅を実現します1. ポジショニング <!DOCTYPE ht...
Dreamweaver8 を使用して独自の Web サイトを作成する目的は何ですか?インターネットに...
序文カバーリング インデックスについて説明する前に、まずそのデータ構造である B+ ツリーを理解する...
序文3 列レイアウトは、その名前が示すように、両側が固定され、中央が適応します。実際の開発では、3 ...
この記事では、カードフリップ効果を実現するためのVueの具体的なコードを例として紹介します。具体的な...
目次1. プロトタイプとプロトタイプチェーンの平等関係を理解する2: プロトタイプとプロトタイプ チ...
ウェブサイトがワイドスクリーンの場合、ブラウザ ウィンドウを左右にドラッグすると、ウェブサイトの幅が...
2 つのテーブルを関連付けるときに、外部キーを作成できませんでした。このブログから、問題は、ポイント...