SlideShare a Scribd company logo
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
MySQL Enterprise Editionを利用した
データの暗号化と暗号鍵のローテーション
2017/06/03
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
Safe Harbor Statement
The following is intended to outline our general product direction. It is intended for
information purposes only, and may not be incorporated into any contract. It is not a
commitment to deliver any material, code, or functionality, and should not be relied upon
in making purchasing decisions. The development, release, and timing of any features or
functionality described for Oracle’s products remains at the sole discretion of Oracle.
2
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
概要
• 対称鍵の問題
– 暗号化と復号化鍵が同じな為、鍵を所持している
全てのユーザー(開発者・エンジニア)がデータの参照が可能 (ハードコーディング)
– 定期的に鍵を更新する場合に、データの復号化→再暗号化が必要
データ量が多い場合は、大きな負担になる事もある
• 非対称および対称暗号を使用したハイブリッド暗号化による対応
– 一般ユーザーはデータを暗号化する権限のみ (ランダム暗号化鍵を生成)
– 信頼できるユーザーはデータを参照する事が可能
– 鍵のローテーションは、データそのものでは無くデータを復号化する鍵自体を
復号化→再暗号化する事で、軽い負担で鍵のローテーションが可能
Confidential – Oracle Internal 3
目的:鍵の定期的なローテーション・暗号化鍵の管理方法の改善
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
ハイブリッド暗号化による運用
• 信頼できるアプリ (機密情報・個人情報管理者)
– 秘密鍵を取得する(例では、保護されたテーブルを利用してますがAPIでも可能)
– 秘密鍵でランダム鍵を解読する
– 機密データをランダムキーで解読する - データを読み込む
• データを再暗号化せずにプライベート暗号化キーをローテーション
– 新しい秘密鍵と公開鍵のペアを生成する
– 鍵管理テーブルを更新
– 公開鍵と秘密鍵を変更する
4
対称鍵 非対称暗鍵
+
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
ハンズオン: システム要件
5
トライアル用ソフトウエアダウンロード先:
http://edelivery.oracle.com/
プラットホームに合った、最新版のMySQL Enterprise Editionをダウンロードして下さい。
Enterprise Encryption概要
https://www.mysql.com/jp/products/enterprise/encryption.html
参照ブログ
http://mysqlserverteam.com/hybrid-data-encryption-by-example-using-mysql-enterprise-edition/
※ 必要に応じて、鍵管理サーバーを別途準備して、鍵の管理を行う事も可能です。
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
ハンズオン:ステップ①
• 1
アプリケーションユーザー (一般ユーザー)
– このアプリケーションユーザーは機密情報を見る事は出来ない
– データを取得してランダム鍵でデータを暗号化
• 2
– 信頼しているアプリケーションユーザー(機密情報管理者)
– このユーザーのみデータを参照する事が可能
6
CREATE schema secdemo;
CREATE USER 'trusteduser'@'localhost' IDENTIFIED BY '*&^*(9879879DDSdse';
GRANT ALL ON secdemo.* TO 'trusteduser'@'localhost';
CREATE USER 'appuser'@'localhost' IDENTIFIED BY '8374@#$%GRfDgfPTfg';
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
ハンズオン:ステップ②
/* Table secretsdata stores your “secret” as encrypted data */
/* secretskey – stores the encrypted secret key */
7
/* secretspubkey – stores the public key – grant so web app can read the key */
/* secretsprivkey – stores the private key */
/* grant so only privileged user/app can get the private key */
CREATE TABLE `secdemo`.`secretsdata` (
`id` INT NOT NULL,
`secret` VARBINARY(3000) NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE `secdemo`.`apppublickey` (
`appid` INT NOT NULL,
`publickey` VARBINARY(3000) NOT NULL,
PRIMARY KEY (`appid`));
CREATE TABLE `secdemo`.`secretskey` (
`id` INT NOT NULL,
`secretkey` VARBINARY(3000) NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE `secdemo`.`privuserprivatekey` (
`appid` INT NOT NULL,
`privatekey` VARBINARY(3000) NOT NULL,
PRIMARY KEY (`appid`));
ハンズオンで利用するデータベースオブジェクトの作成
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
ハンズオン:ステップ③
/* GRANT TO APPUSER */
8
GRANT SELECT, INSERT, DELETE, UPDATE ON secdemo.secretsdata TO 'appuser'@'localhost';
GRANT SELECT ON secdemo.apppublickey TO 'appuser'@'localhost';
GRANT INSERT ON `secdemo`.`secretskey` TO 'appuser'@'localhost';
appuserは
secretdataを更新可能
appuserは、
public keyを参照可能
appuserは、暗号化
されたパスフレーズ
をINSERTのみ可能trusteduser@localhost [secdemo]> show tables;
+--------------------+
| Tables_in_secdemo |
+--------------------+
| apppublickey |
| privuserprivatekey |
| secretsdata |
| secretskey |
+--------------------+
4 rows in set (0.00 sec)
appuser@localhost [secdemo]> show tables;
+-------------------+
| Tables_in_secdemo |
+-------------------+
| apppublickey |
| secretsdata |
| secretskey |
+-------------------+
3 rows in set (0.00 sec)
一般ユーザーに権限を付与 (暗号化のみ可能なアプリケーションユーザー)
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
ハンズオン:ステップ④
/* Key length in bits; make larger for stronger keys : CPU usage 1024 < 2048 */
/* Create private key */
/* Server – Generate Public Key */
/* Derive corresponding public key from private key, using same algorithm */
9
[secdemo]> select appid,privatekey from secdemo.privuserprivatekey¥G
*************************** 1. row ***************************
appid: 1
privatekey: -----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEApOJW4XusZ5vGKgoK/Q/3CPpMDegafghDNMxG6whiAj0E3aBh
gtXJxDz6faG6by8+IXPVhLiVAb4cKixYGQMzIh0Edsh5/5pGpsSF4dwGzyjX8oEl
jG1KThco+PbtYCNZd8OkKtUiXFsv0/ZuNHKUZ1Fg2RKe3qKZIaWgKqQXlJeOUA5o
dMTwHsT20pBHWGp4O+txwtO1dGO5UvApXmMX/mufxkEb94h4+rhYPRLSAaW2co1X
KtHCcHR9eWL/RkE1ZdULrf9GxALtFxX17gNPaexBVIBZ06MEzQ+ff38nL6sefNse
zM+RFrNEFX+qK5r9GTAgbSjPTNmFnsnrvM/JKQIDAQABAoIBACljk5GIXO+pH6Y/
3SBHGKjNQ7gd8kB+zHf9azPmZ8vOC2Git7eC+OHkuLA+n7D3N+5nyEpHl0fXs/Q2
K2sj7Xr7s7opes5ZqLCGFmFqvN7VjteV6ZoFeSh/Ec7lFRMT7Iputs/1rmlmjmvz
qRhLRstklx4GWZDjWfMjQ0BQ7oZi2bYBA1GBqVaDN6LuSGbKe9JPevCxrE69KPRR
VWswCFSnLVh59zqCXbMfNNGURP8Ii5cg23FsWcBSaUt4L8Uu+b7wOt1hzAbTRHWq
+RgedisCzpm4PepuKYR59zi5ys6mR1GJGGZxjKKtcHkF6gyIo8mZD/spiNOmsqRG
oy0A9/ECgYEAzel0lhdzUWDxThH3kYBq/phPmabfvLFusJXZT+ouRoT8falItoZq
AHYwbYnZ3kNYZYBru/Vll2PJQH5jPRS5lpqqxogkHOph/QW9KeNrc9bWvppzoMEC
IRX18ZtmZ2X942TPlsHCOHNH07Nf9d+FHG1iugO0Z7pI2KOioDngc/UCgYEAzP4A
baiq0ft84v8HrFmkNrp6sc9Ztj7xXc4f3RJVeTcWjtiGzYo9yuRX/RzOEVYcOdef
kQ7tSyxZbCoUi3lVd5SPh+1/hCiZFySyzsNgMLQTEtUVDc87InLfLFjyXdZzg6TW
e9WtbL133sS28a4IlU3AdaScabuPqN+PERGNc+UCgYAOUiRHpA3jJQjjUyCSwAmw
90rh9tcsunJmWaWphzH8uZcN7k4eU67fpVis5Z9/c9OcC5hylBiitM/0alXgk6Zs
sQkbkbBhSnPSMyn61dRNVC3PR9Ku5X2Oa4aVbSdsHY3Q2NwPMh6d6naeZKVR5l/N
oFXzdfqAFFaoqojO9/eCWQKBgQC1/8XNlnSjHg9RUnAzmxrq5EHO4HOcFOIjEMDF
fGOazUgf5yo4Dsax/m4IcaybQ8KnsEMhfQk9NtDl8a5v7nftRV7xpfETGyBgpdqD
LH+Yfih5Deo1aonsGeT+8LGukpnYhV9QbvQcmVN121050fQY6wE28cFVNotjuajB
1L2r6QKBgQCVgzVxU11bsGtFuphIKsZ7D6ptIxbiQ1x1iiM1dbnOW1PxLT/UCaUr
ceRov28FPDbpmh3L5af80dB62a8uKmtqQcUSLdm1gbM6LmvTl8kGLmgK66qmcX8n
1fR9yomrJao5CFgY/LZnGkJFfNvOV+crapX9PIajJWOcEfqEynyo+w==
-----END RSA PRIVATE KEY-----
[secdemo]> select appid,publickey from secdemo.apppublickey¥G
*************************** 1. row ***************************
appid: 1
publickey: -----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApOJW4XusZ5vGKgoK/Q/3CPpMDegafghDNMxG6whiAj0E3aBhgtXJ
xDz6faG6by8+IXPVhLiVAb4cKixYGQMzIh0Edsh5/5pGpsSF4dwGzyjX8oEljG1K
Thco+PbtYCNZd8OkKtUiXFsv0/ZuNHKUZ1Fg2RKe3qKZIaWgKqQXlJeOUA5odMTw
HsT20pBHWGp4O+txwtO1dGO5UvApXmMX/mufxkEb94h4+rhYPRLSAaW2co1XKtHC
cHR9eWL/RkE1ZdULrf9GxALtFxX17gNPaexBVIBZ06MEzQ+ff38nL6sefNsezM+R
FrNEFX+qK5r9GTAgbSjPTNmFnsnrvM/JKQIDAQAB
-----END RSA PUBLIC KEY-----
SET @key_len = 2048;
SET @algo = 'RSA';
SET @priv = CREATE_ASYMMETRIC_PRIV_KEY(@algo, @key_len);
select @priv; INSERT INTO `secdemo`.`privuserprivatekey`
(`appid`,`privatekey`) VALUES (1, @priv);
SET @pub = CREATE_ASYMMETRIC_PUB_KEY(@algo, @priv);
INSERT INTO `secdemo`.`apppublickey` (`appid`,`publickey`)
VALUES (1, @pub);
AESパスフレーズを
解読する為のキー
AESパスフレーズを
暗号化する為のキー
非対称鍵の作成
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
/* Web Client – Get Public Key (connected as appuser) */
/* Web Client – Generate passphrase */
/* SET @passphrase = keyring_key_generate('MyKey', 'AES', 32); */
/* Web Client – Encrypt Data with passphrase */
/* Web Client – Encrypt passphrase with Public Key */
10
appuser@localhost [secdemo]> select 'Symmetric Passphrase', @passphrase¥G
*************************** 1. row ***************************
Symmetric Passphrase: Symmetric Passphrase
@passphrase: 2555f21178e18b6ec5f883ddb5fad6992f34ece0d83a217e27063fe9
1 row in set (0.00 sec)
appuser@localhost [secdemo]> select HEX(@enc_keepsecret)¥G
*************************** 1. row ***************************
HEX(@enc_keepsecret):
3FFB3865894C83DE4356675A12C46638518D77223775729FC81461EC5534CAF409F6E3
4D0DB1852F7CD6341E1E38907FA94E03851118B7C4555AC2156E2E2E64958A3BF8F43
0348AE07874B49E7FF997
1 row in set (0.00 sec)
appuser@localhost [secdemo]> SELECT 'Decrypt just to check',
AES_DECRYPT(@enc_keepsecret, @passphrase)¥G
*************************** 1. row ***************************
Decrypt just to check: Decrypt just to check
AES_DECRYPT(@enc_keepsecret, @passphrase): Santa and his Elves location is just north east
of Longyearbyen, Norway
appuser@localhost [secdemo]> select 'Encrypted passphrase by using public key',
HEX(@enc_pp)¥G
*************************** 1. row ***************************
Encrypted passphrase by using public key: Encrypted passphrase by using public key
HEX(@enc_pp):
3AFCABA8D8FED44A548EEC89D8BF1024FBAAF40DEE078498A58BB11A2C6545958A41E7A44F
93A723C56751496BB830EEA714F44B18C52F7905C2E6F6733FFCFFDC80049A613575B6884C74
C82888C9D36A1E067ECF9200BBB102040BBA6AE944F51AE3AE137B7FD88455CF2833D978340
E0EB104A8F98DD6655AB520D2FE2C6EDA88B34B4D7ADE72ABA8734B75C0745CF21D81590FE
D309B80CB5B4E5F7B59A15AE2418D6945017CB409F8568F7C96B297729F33F638232230D207A
FB22245D91B65DBAD1C9AAE8A28ECEAD7FBF6D9E3FED486FBE89B40D891FA8112347758191
D0805638649143DADC1A1F3F1CB914333B10E24EAA8BF0F5F1A51DFB40396C8
Encrypt Passphrase by Public Key
SET @key_len = 2048;
SET @algo = 'RSA';
Set @enc_pp = ASYMMETRIC_ENCRYPT(@algo, @passphrase, @webpubkey);
SELECT 'Encrypted passphrase by using public key', HEX(@enc_pp)¥G
SET @keepsecret='Santa and his Elves location is just north east of Longyearbyen, Norway';
select @keepsecret;
SET @enc_keepsecret=AES_ENCRYPT(@keepsecret,@passphrase);
SELECT @enc_keepsecret;
INSERT INTO `secdemo`.`secretsdata` (`id`,`secret`) VALUES (1, @enc_keepsecret);
SELECT 'Decrypt just to check', AES_DECRYPT(@enc_keepsecret, @passphrase);
SET @passphrase = SHA2(lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0), 224);
select 'Symmetric Passphrase', @passphrase;
select publickey from `secdemo`.`apppublickey` where appid=1 INTO @webpubkey;
select 'web public key', @webpubkey;
AESパスフレーズは常に
ランダムに生成されます
ハンズオン:ステップ⑤ : データの暗号化
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
/* Server - Store AES Data and PK Encrypted Passphrase */
/* Look at key (you can't no permission and even if could - its encrypted */
/* Look at data - its encrypted */
11
trusteduser@localhost [secdemo]> select id,hex(secretkey) from secdemo.secretskey¥G
*************************** 1. row ***************************
id: 1
hex(secretkey):
3AFCABA8D8FED44A548EEC89D8BF1024FBAAF40DEE078498A58BB11A2C6545958A41E7A44F
93A723C56751496BB830EEA714F44B18C52F7905C2E6F6733FFCFFDC80049A613575B6884C74
C82888C9D36A1E067ECF9200BBB102040BBA6AE944F51AE3AE137B7FD88455CF2833D978340
E0EB104A8F98DD6655AB520D2FE2C6EDA88B34B4D7ADE72ABA8734B75C0745CF21D81590FE
D309B80CB5B4E5F7B59A15AE2418D6945017CB409F8568F7C96B297729F33F638232230D207A
FB22245D91B65DBAD1C9AAE8A28ECEAD7FBF6D9E3FED486FBE89B40D891FA8112347758191
D0805638649143DADC1A1F3F1CB914333B10E24EAA8BF0F5F1A51DFB40396C8
1 row in set (0.00 sec)
appuser@localhost [secdemo]> select id,hex(secret) from `secdemo`.`secretsdata`¥G
*************************** 1. row ***************************
id: 1
hex(secret):
3FFB3865894C83DE4356675A12C46638518D77223775729FC81461EC5534CAF409F6E34D0DB1
852F7CD6341E1E38907FA94E03851118B7C4555AC2156E2E2E64958A3BF8F430348AE07874B4
9E7FF997
1 row in set (0.00 sec)
Encrypt AES Passphrase by Public Key
INSERT INTO `secdemo`.`secretskey` (`id`, `secretkey`) VALUES (1, @enc_pp);
appuser@localhost [secdemo]> select id,hex(secretkey) from secdemo.secretskey¥G
ERROR 1142 (42000): SELECT command denied to user 'appuser'@'localhost' for table
'secretskey'
select id,hex(secret) from `secdemo`.`secretsdata`¥G
データはAES()によって
暗号化されている
公開鍵で暗号化された
AESパスフレーズを保存
appuserはパスフレーズを、
読むことが出来なくなりました
Encrypted data by AES Passphrase
ハンズオン:ステップ⑥ : 暗号化したデータの保存
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
Web App開発時のメリット
• 暗号化鍵を保存しません(挿入するたびにランダムに生成されます)
• エクスポーズできるハードコーディングされたキーは不要
– 設定ファイルにキー埋め込み不要
– 鍵のローテーションが不要
• 暗号化後にデータを解読することは出来ない
– アプリがメモリ内にキーを保存しない限り
12
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. |
/* 管理者アカウント – Read PK Encrypted Passphrase */
/* 管理者アカウント– Get Private Key */
/*管理者アカウント– Decrypt passphrase with Private Key */
/*管理者アカウント– Read AES Encrypted Data */
/*管理者アカウント– See Secret Data */
/*管理者アカウント– Decrypt data with Passphrase */
13
trusteduser@localhost [secdemo]> select 'privappprivpkey', @privappprivpkey¥G
*************************** 1. row ***************************
privappprivpkey: privappprivpkey
@privappprivpkey: -----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEApOJW4XusZ5vGKgoK/Q/3CPpMDegafghDNMxG6whiAj0E3aBh
gtXJxDz6faG6by8+IXPVhLiVAb4cKixYGQMzIh0Edsh5/5pGpsSF4dwGzyjX8oEl
jG1KThco+PbtYCNZd8OkKtUiXFsv0/ZuNHKUZ1Fg2RKe3qKZIaWgKqQXlJeOUA5o
dMTwHsT20pBHWGp4O+txwtO1dGO5UvApXmMX/mufxkEb94h4+rhYPRLSAaW2co1
<SNIP>
oFXzdfqAFFaoqojO9/eCWQKBgQC1/8XNlnSjHg9RUnAzmxrq5EHO4HOcFOIjEMDF
fGOazUgf5yo4Dsax/m4IcaybQ8KnsEMhfQk9NtDl8a5v7nftRV7xpfETGyBgpdqD
LH+Yfih5Deo1aonsGeT+8LGukpnYhV9QbvQcmVN121050fQY6wE28cFVNotjuajB
1L2r6QKBgQCVgzVxU11bsGtFuphIKsZ7D6ptIxbiQ1x1iiM1dbnOW1PxLT/UCaUr
ceRov28FPDbpmh3L5af80dB62a8uKmtqQcUSLdm1gbM6LmvTl8kGLmgK66qmcX8n
1fR9yomrJao5CFgY/LZnGkJFfNvOV+crapX9PIajJWOcEfqEynyo+w==
-----END RSA PRIVATE KEY-----
trusteduser@localhost [secdemo]> select 'Original Symmetric Passphrase', @enc_pp¥G
*************************** 1. row ***************************
Original Symmetric Passphrase: Original Symmetric Passphrase
@enc_pp: 2555f21178e18b6ec5f883ddb5fad6992f34ece0d83a217e27063fe9
1 row in set (0.00 sec)
trusteduser@localhost [secdemo]> select AES_DECRYPT(secret, @enc_pp) from `secdemo`.`secretsdata`
where id=1¥G
*************************** 1. row ***************************
AES_DECRYPT(secret, @enc_pp): Santa and his Elves location is just north east of Longyearbyen,
Norway
1 row in set (0.00 sec)
trusteduser@localhost [secdemo]>
select secretkey from `secdemo`.`secretskey` where id=1 INTO @encpassphrase;
select privatekey from `secdemo`.`privuserprivatekey` where appid=1 INTO @privappprivpkey;
select 'privappprivpkey', @privappprivpkey;
SET @key_len = 2048;
SET @algo = 'RSA';
Set @enc_pp = ASYMMETRIC_DECRYPT(@algo, @encpassphrase, @privappprivpkey);
select 'Original Symmetric Passphrase', @enc_pp;
select id,hex(secret) from `secdemo`.`secretsdata`;
select AES_DECRYPT(secret, @enc_pp) from `secdemo`.`secretsdata` where id=1;
ハンズオン:ステップ⑦ :暗号化されたデータの参照
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | 14
Application
Use Private key For Decrypting AES Passphrase.
Then decrypt encrypted data with AES_ENCRYPT().
AES_ENCRYPT()
AES_DECRYPT()
1) Encrypt data with AES_ENCRYPT()
AES Passphrase is always generated randomly.
SET @passphrase = SHA2(lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0), 224);
2) Use the public key for encrypting AES passphrase.
3) Encrypted passphrase is inserted by appuser.
※ appuser doesn’t have “select” authentication.Encrypted Data
Encrypted passphrase
Appuser
Trusteduser
For Rotating Passphrase:
1) Decrypt AES Passphrase with current private key.
2) Encrypt AES Passphrase with new public key.
① 暗号鍵をランダムに
生成しデータを暗号化し保存
② “①”で生成した 暗号鍵を
Public鍵で暗号化して保存
③暗号化された鍵を
Private鍵で復号化しデータを参照
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | 15
appuser@localhost [secdemo]> SET @key_len = 2048;SET @algo = 'RSA';
appuser@localhost [secdemo]> SET @passphrase = SHA2(lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0), 224);
appuser@localhost [secdemo]> SET @keepsecret='This is confidential data 2nd connection by appuser';
appuser@localhost [secdemo]> SET @enc_keepsecret=AES_ENCRYPT(@keepsecret,@passphrase);
appuser@localhost [secdemo]> INSERT INTO `secdemo`.`secretsdata` (`id`,`secret`) VALUES (2, @enc_keepsecret);
appuser@localhost [secdemo]> select publickey from `secdemo`.`apppublickey` where appid=1 INTO @webpubkey;
appuser@localhost [secdemo]> Set @enc_pp = ASYMMETRIC_ENCRYPT(@algo, @passphrase, @webpubkey);
appuser@localhost [secdemo]> INSERT INTO `secdemo`.`secretskey` (`id`, `secretkey`) VALUES (2, @enc_pp);
trusteduser@localhost [secdemo]> SET @key_len = 2048;SET @algo = 'RSA';
trusteduser@localhost [secdemo]> select secretkey from `secdemo`.`secretskey` where id=2 INTO @encpassphrase;
trusteduser@localhost [secdemo]> select privatekey from `secdemo`.`privuserprivatekey` where appid=1 INTO @privappprivpkey;
trusteduser@localhost [secdemo]> Set @enc_pp = ASYMMETRIC_DECRYPT(@algo, @encpassphrase, @privappprivpkey);
trusteduser@localhost [secdemo]> select AES_DECRYPT(secret, @enc_pp) from `secdemo`.`secretsdata` where id=2;
+-----------------------------------------------------+
| AES_DECRYPT(secret, @enc_pp) |
+-----------------------------------------------------+
| This is confidential data 2nd connection by appuser |
+-----------------------------------------------------+
trusteduser@localhost [secdemo]> select id,left(hex(secretkey),100) from secretskey;
+----+------------------------------------------------------------------------------------------------------+
| id | left(hex(secretkey),100) |
+----+------------------------------------------------------------------------------------------------------+
| 1 | 3AFCABA8D8FED44A548EEC89D8BF1024FBAAF40DEE078498A58BB11A2C6545958A41E7A44F93A723C56751496BB830EEA714 |
| 2 | 692B0B30335A81CF5836A5EE090593CC71EC18690EBE3A40D1128289ECCC177FD7F64729A46227C6B8701CE7C52876C9B672 |
+----+------------------------------------------------------------------------------------------------------+
① 暗号鍵をランダムに
生成しデータを暗号化し保存
② “①”で生成した 暗号鍵を
Public鍵で暗号化して保存
③暗号化された鍵を
Private鍵で復号化しデータを参照
こちらの鍵を復号化&暗号化する事で鍵の定期的なローテーションを行う
Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | 16
Thank You
運用に合わせて適宜、カスタマイズして活用下さい。
MySQLデータ暗号化と暗号鍵のローテーション

More Related Content

What's hot

Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話
健一 辰濱
 
AWS Black Belt Techシリーズ Amazon SES
AWS Black Belt Techシリーズ  Amazon SESAWS Black Belt Techシリーズ  Amazon SES
AWS Black Belt Techシリーズ Amazon SES
Amazon Web Services Japan
 
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
Ohyama Masanori
 
#idcon vol.29 - #fidcon WebAuthn, Next Stage
#idcon vol.29 - #fidcon WebAuthn, Next Stage#idcon vol.29 - #fidcon WebAuthn, Next Stage
#idcon vol.29 - #fidcon WebAuthn, Next Stage
Nov Matake
 
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
Amazon Web Services Japan
 
ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計
kaminashi
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
 
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Noritaka Sekiyama
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
 
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
hideakikabuto
 
Keycloakの最近のトピック
Keycloakの最近のトピックKeycloakの最近のトピック
Keycloakの最近のトピック
Hitachi, Ltd. OSS Solution Center.
 
Amazon Glacierのご紹介(機能編)
Amazon Glacierのご紹介(機能編) Amazon Glacierのご紹介(機能編)
Amazon Glacierのご紹介(機能編)
Amazon Web Services Japan
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
kwatch
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
Uptime Technologies LLC (JP)
 
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベントAzure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Shingo Kawahara
 
FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門
Yahoo!デベロッパーネットワーク
 

What's hot (20)

Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話
 
AWS Black Belt Techシリーズ Amazon SES
AWS Black Belt Techシリーズ  Amazon SESAWS Black Belt Techシリーズ  Amazon SES
AWS Black Belt Techシリーズ Amazon SES
 
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
 
#idcon vol.29 - #fidcon WebAuthn, Next Stage
#idcon vol.29 - #fidcon WebAuthn, Next Stage#idcon vol.29 - #fidcon WebAuthn, Next Stage
#idcon vol.29 - #fidcon WebAuthn, Next Stage
 
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
 
ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
 
Keycloakの最近のトピック
Keycloakの最近のトピックKeycloakの最近のトピック
Keycloakの最近のトピック
 
Amazon Glacierのご紹介(機能編)
Amazon Glacierのご紹介(機能編) Amazon Glacierのご紹介(機能編)
Amazon Glacierのご紹介(機能編)
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベントAzure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
 
FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門FIDO認証によるパスワードレスログイン実装入門
FIDO認証によるパスワードレスログイン実装入門
 

Similar to MySQLデータ暗号化と暗号鍵のローテーション

WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形Yusaku Watanabe
 
Treasure data demo.0517
Treasure data demo.0517Treasure data demo.0517
Treasure data demo.0517
BigData Sios
 
ACI + Ansible
ACI + AnsibleACI + Ansible
ACI + Ansible
Takehiro Yokoishi
 
20190530 osc hokkaido_public
20190530 osc hokkaido_public20190530 osc hokkaido_public
20190530 osc hokkaido_public
DAISUKE INAGAKI
 
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
Shinya Sugiyama
 
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
Ryusuke Kajiyama
 
MySQLの公式GUIツール MySQL Workbench
MySQLの公式GUIツール MySQL WorkbenchMySQLの公式GUIツール MySQL Workbench
MySQLの公式GUIツール MySQL Workbench
yoyamasaki
 
性能問題を起こしにくい信頼されるクラウド RDB のつくりかた
性能問題を起こしにくい信頼されるクラウド RDB のつくりかた性能問題を起こしにくい信頼されるクラウド RDB のつくりかた
性能問題を起こしにくい信頼されるクラウド RDB のつくりかた
Tomoyuki Oota
 
Oracle GoldenGate Cloud Serviceユーザーズガイド
Oracle GoldenGate Cloud ServiceユーザーズガイドOracle GoldenGate Cloud Serviceユーザーズガイド
Oracle GoldenGate Cloud Serviceユーザーズガイド
オラクルエンジニア通信
 
サンプルで学ぶCassandraアプリケーションの作り方
サンプルで学ぶCassandraアプリケーションの作り方サンプルで学ぶCassandraアプリケーションの作り方
サンプルで学ぶCassandraアプリケーションの作り方
Yuki Morishita
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
Daiyu Hatakeyama
 
Insight into Azure Active Directory - Azure AD Custom Role & Scope
Insight into Azure Active Directory - Azure AD Custom Role & ScopeInsight into Azure Active Directory - Azure AD Custom Role & Scope
Insight into Azure Active Directory - Azure AD Custom Role & Scope
Kazuki Takai
 
Introduction to New CloudWatch Agent
Introduction to New CloudWatch AgentIntroduction to New CloudWatch Agent
Introduction to New CloudWatch Agent
Noritaka Sekiyama
 
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
Insight Technology, Inc.
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
Michitaka Terada
 
20150131 ChugokuDB-Shimane-MySQL
20150131 ChugokuDB-Shimane-MySQL20150131 ChugokuDB-Shimane-MySQL
20150131 ChugokuDB-Shimane-MySQL
Ryusuke Kajiyama
 
20180613 AWS Black Belt Online Seminar AWS Cloud9 入門
20180613 AWS Black Belt Online Seminar AWS Cloud9 入門20180613 AWS Black Belt Online Seminar AWS Cloud9 入門
20180613 AWS Black Belt Online Seminar AWS Cloud9 入門
Amazon Web Services Japan
 
MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料
MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料 MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料
MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料
yoyamasaki
 
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
Cloudera Japan
 
Oracle Data Integrator Cloud Serviceユーザーズガイド
Oracle Data Integrator Cloud ServiceユーザーズガイドOracle Data Integrator Cloud Serviceユーザーズガイド
Oracle Data Integrator Cloud Serviceユーザーズガイド
オラクルエンジニア通信
 

Similar to MySQLデータ暗号化と暗号鍵のローテーション (20)

WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
 
Treasure data demo.0517
Treasure data demo.0517Treasure data demo.0517
Treasure data demo.0517
 
ACI + Ansible
ACI + AnsibleACI + Ansible
ACI + Ansible
 
20190530 osc hokkaido_public
20190530 osc hokkaido_public20190530 osc hokkaido_public
20190530 osc hokkaido_public
 
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
 
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
 
MySQLの公式GUIツール MySQL Workbench
MySQLの公式GUIツール MySQL WorkbenchMySQLの公式GUIツール MySQL Workbench
MySQLの公式GUIツール MySQL Workbench
 
性能問題を起こしにくい信頼されるクラウド RDB のつくりかた
性能問題を起こしにくい信頼されるクラウド RDB のつくりかた性能問題を起こしにくい信頼されるクラウド RDB のつくりかた
性能問題を起こしにくい信頼されるクラウド RDB のつくりかた
 
Oracle GoldenGate Cloud Serviceユーザーズガイド
Oracle GoldenGate Cloud ServiceユーザーズガイドOracle GoldenGate Cloud Serviceユーザーズガイド
Oracle GoldenGate Cloud Serviceユーザーズガイド
 
サンプルで学ぶCassandraアプリケーションの作り方
サンプルで学ぶCassandraアプリケーションの作り方サンプルで学ぶCassandraアプリケーションの作り方
サンプルで学ぶCassandraアプリケーションの作り方
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
 
Insight into Azure Active Directory - Azure AD Custom Role & Scope
Insight into Azure Active Directory - Azure AD Custom Role & ScopeInsight into Azure Active Directory - Azure AD Custom Role & Scope
Insight into Azure Active Directory - Azure AD Custom Role & Scope
 
Introduction to New CloudWatch Agent
Introduction to New CloudWatch AgentIntroduction to New CloudWatch Agent
Introduction to New CloudWatch Agent
 
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
 
20150131 ChugokuDB-Shimane-MySQL
20150131 ChugokuDB-Shimane-MySQL20150131 ChugokuDB-Shimane-MySQL
20150131 ChugokuDB-Shimane-MySQL
 
20180613 AWS Black Belt Online Seminar AWS Cloud9 入門
20180613 AWS Black Belt Online Seminar AWS Cloud9 入門20180613 AWS Black Belt Online Seminar AWS Cloud9 入門
20180613 AWS Black Belt Online Seminar AWS Cloud9 入門
 
MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料
MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料 MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料
MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料
 
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
 
Oracle Data Integrator Cloud Serviceユーザーズガイド
Oracle Data Integrator Cloud ServiceユーザーズガイドOracle Data Integrator Cloud Serviceユーザーズガイド
Oracle Data Integrator Cloud Serviceユーザーズガイド
 

More from Shinya Sugiyama

MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較
Shinya Sugiyama
 
MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較
Shinya Sugiyama
 
MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較
Shinya Sugiyama
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較
Shinya Sugiyama
 
MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理
Shinya Sugiyama
 
Locondo 20190703@inno db_cluster
Locondo 20190703@inno db_clusterLocondo 20190703@inno db_cluster
Locondo 20190703@inno db_cluster
Shinya Sugiyama
 
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupLocondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
Shinya Sugiyama
 
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDODB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDO
Shinya Sugiyama
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
Shinya Sugiyama
 
MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介
Shinya Sugiyama
 
MySQL Partition Engine
MySQL Partition EngineMySQL Partition Engine
MySQL Partition Engine
Shinya Sugiyama
 
Oracle Cloud MySQL Service
Oracle Cloud MySQL ServiceOracle Cloud MySQL Service
Oracle Cloud MySQL Service
Shinya Sugiyama
 
MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017
Shinya Sugiyama
 
Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7
Shinya Sugiyama
 
Multi thread slave_performance_on_opc
Multi thread slave_performance_on_opcMulti thread slave_performance_on_opc
Multi thread slave_performance_on_opc
Shinya Sugiyama
 
db tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストアdb tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストア
Shinya Sugiyama
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003
Shinya Sugiyama
 
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
Shinya Sugiyama
 
MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良
Shinya Sugiyama
 
MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)
Shinya Sugiyama
 

More from Shinya Sugiyama (20)

MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較
 
MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較
 
MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較
 
MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理
 
Locondo 20190703@inno db_cluster
Locondo 20190703@inno db_clusterLocondo 20190703@inno db_cluster
Locondo 20190703@inno db_cluster
 
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupLocondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
 
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDODB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDO
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
 
MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介
 
MySQL Partition Engine
MySQL Partition EngineMySQL Partition Engine
MySQL Partition Engine
 
Oracle Cloud MySQL Service
Oracle Cloud MySQL ServiceOracle Cloud MySQL Service
Oracle Cloud MySQL Service
 
MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017
 
Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7
 
Multi thread slave_performance_on_opc
Multi thread slave_performance_on_opcMulti thread slave_performance_on_opc
Multi thread slave_performance_on_opc
 
db tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストアdb tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストア
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003
 
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
 
MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良
 
MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)
 

MySQLデータ暗号化と暗号鍵のローテーション

  • 1. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | MySQL Enterprise Editionを利用した データの暗号化と暗号鍵のローテーション 2017/06/03
  • 2. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 2
  • 3. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | 概要 • 対称鍵の問題 – 暗号化と復号化鍵が同じな為、鍵を所持している 全てのユーザー(開発者・エンジニア)がデータの参照が可能 (ハードコーディング) – 定期的に鍵を更新する場合に、データの復号化→再暗号化が必要 データ量が多い場合は、大きな負担になる事もある • 非対称および対称暗号を使用したハイブリッド暗号化による対応 – 一般ユーザーはデータを暗号化する権限のみ (ランダム暗号化鍵を生成) – 信頼できるユーザーはデータを参照する事が可能 – 鍵のローテーションは、データそのものでは無くデータを復号化する鍵自体を 復号化→再暗号化する事で、軽い負担で鍵のローテーションが可能 Confidential – Oracle Internal 3 目的:鍵の定期的なローテーション・暗号化鍵の管理方法の改善
  • 4. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | ハイブリッド暗号化による運用 • 信頼できるアプリ (機密情報・個人情報管理者) – 秘密鍵を取得する(例では、保護されたテーブルを利用してますがAPIでも可能) – 秘密鍵でランダム鍵を解読する – 機密データをランダムキーで解読する - データを読み込む • データを再暗号化せずにプライベート暗号化キーをローテーション – 新しい秘密鍵と公開鍵のペアを生成する – 鍵管理テーブルを更新 – 公開鍵と秘密鍵を変更する 4 対称鍵 非対称暗鍵 +
  • 5. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | ハンズオン: システム要件 5 トライアル用ソフトウエアダウンロード先: http://edelivery.oracle.com/ プラットホームに合った、最新版のMySQL Enterprise Editionをダウンロードして下さい。 Enterprise Encryption概要 https://www.mysql.com/jp/products/enterprise/encryption.html 参照ブログ http://mysqlserverteam.com/hybrid-data-encryption-by-example-using-mysql-enterprise-edition/ ※ 必要に応じて、鍵管理サーバーを別途準備して、鍵の管理を行う事も可能です。
  • 6. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | ハンズオン:ステップ① • 1 アプリケーションユーザー (一般ユーザー) – このアプリケーションユーザーは機密情報を見る事は出来ない – データを取得してランダム鍵でデータを暗号化 • 2 – 信頼しているアプリケーションユーザー(機密情報管理者) – このユーザーのみデータを参照する事が可能 6 CREATE schema secdemo; CREATE USER 'trusteduser'@'localhost' IDENTIFIED BY '*&^*(9879879DDSdse'; GRANT ALL ON secdemo.* TO 'trusteduser'@'localhost'; CREATE USER 'appuser'@'localhost' IDENTIFIED BY '8374@#$%GRfDgfPTfg';
  • 7. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | ハンズオン:ステップ② /* Table secretsdata stores your “secret” as encrypted data */ /* secretskey – stores the encrypted secret key */ 7 /* secretspubkey – stores the public key – grant so web app can read the key */ /* secretsprivkey – stores the private key */ /* grant so only privileged user/app can get the private key */ CREATE TABLE `secdemo`.`secretsdata` ( `id` INT NOT NULL, `secret` VARBINARY(3000) NOT NULL, PRIMARY KEY (`id`)); CREATE TABLE `secdemo`.`apppublickey` ( `appid` INT NOT NULL, `publickey` VARBINARY(3000) NOT NULL, PRIMARY KEY (`appid`)); CREATE TABLE `secdemo`.`secretskey` ( `id` INT NOT NULL, `secretkey` VARBINARY(3000) NOT NULL, PRIMARY KEY (`id`)); CREATE TABLE `secdemo`.`privuserprivatekey` ( `appid` INT NOT NULL, `privatekey` VARBINARY(3000) NOT NULL, PRIMARY KEY (`appid`)); ハンズオンで利用するデータベースオブジェクトの作成
  • 8. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | ハンズオン:ステップ③ /* GRANT TO APPUSER */ 8 GRANT SELECT, INSERT, DELETE, UPDATE ON secdemo.secretsdata TO 'appuser'@'localhost'; GRANT SELECT ON secdemo.apppublickey TO 'appuser'@'localhost'; GRANT INSERT ON `secdemo`.`secretskey` TO 'appuser'@'localhost'; appuserは secretdataを更新可能 appuserは、 public keyを参照可能 appuserは、暗号化 されたパスフレーズ をINSERTのみ可能trusteduser@localhost [secdemo]> show tables; +--------------------+ | Tables_in_secdemo | +--------------------+ | apppublickey | | privuserprivatekey | | secretsdata | | secretskey | +--------------------+ 4 rows in set (0.00 sec) appuser@localhost [secdemo]> show tables; +-------------------+ | Tables_in_secdemo | +-------------------+ | apppublickey | | secretsdata | | secretskey | +-------------------+ 3 rows in set (0.00 sec) 一般ユーザーに権限を付与 (暗号化のみ可能なアプリケーションユーザー)
  • 9. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | ハンズオン:ステップ④ /* Key length in bits; make larger for stronger keys : CPU usage 1024 < 2048 */ /* Create private key */ /* Server – Generate Public Key */ /* Derive corresponding public key from private key, using same algorithm */ 9 [secdemo]> select appid,privatekey from secdemo.privuserprivatekey¥G *************************** 1. row *************************** appid: 1 privatekey: -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEApOJW4XusZ5vGKgoK/Q/3CPpMDegafghDNMxG6whiAj0E3aBh gtXJxDz6faG6by8+IXPVhLiVAb4cKixYGQMzIh0Edsh5/5pGpsSF4dwGzyjX8oEl jG1KThco+PbtYCNZd8OkKtUiXFsv0/ZuNHKUZ1Fg2RKe3qKZIaWgKqQXlJeOUA5o dMTwHsT20pBHWGp4O+txwtO1dGO5UvApXmMX/mufxkEb94h4+rhYPRLSAaW2co1X KtHCcHR9eWL/RkE1ZdULrf9GxALtFxX17gNPaexBVIBZ06MEzQ+ff38nL6sefNse zM+RFrNEFX+qK5r9GTAgbSjPTNmFnsnrvM/JKQIDAQABAoIBACljk5GIXO+pH6Y/ 3SBHGKjNQ7gd8kB+zHf9azPmZ8vOC2Git7eC+OHkuLA+n7D3N+5nyEpHl0fXs/Q2 K2sj7Xr7s7opes5ZqLCGFmFqvN7VjteV6ZoFeSh/Ec7lFRMT7Iputs/1rmlmjmvz qRhLRstklx4GWZDjWfMjQ0BQ7oZi2bYBA1GBqVaDN6LuSGbKe9JPevCxrE69KPRR VWswCFSnLVh59zqCXbMfNNGURP8Ii5cg23FsWcBSaUt4L8Uu+b7wOt1hzAbTRHWq +RgedisCzpm4PepuKYR59zi5ys6mR1GJGGZxjKKtcHkF6gyIo8mZD/spiNOmsqRG oy0A9/ECgYEAzel0lhdzUWDxThH3kYBq/phPmabfvLFusJXZT+ouRoT8falItoZq AHYwbYnZ3kNYZYBru/Vll2PJQH5jPRS5lpqqxogkHOph/QW9KeNrc9bWvppzoMEC IRX18ZtmZ2X942TPlsHCOHNH07Nf9d+FHG1iugO0Z7pI2KOioDngc/UCgYEAzP4A baiq0ft84v8HrFmkNrp6sc9Ztj7xXc4f3RJVeTcWjtiGzYo9yuRX/RzOEVYcOdef kQ7tSyxZbCoUi3lVd5SPh+1/hCiZFySyzsNgMLQTEtUVDc87InLfLFjyXdZzg6TW e9WtbL133sS28a4IlU3AdaScabuPqN+PERGNc+UCgYAOUiRHpA3jJQjjUyCSwAmw 90rh9tcsunJmWaWphzH8uZcN7k4eU67fpVis5Z9/c9OcC5hylBiitM/0alXgk6Zs sQkbkbBhSnPSMyn61dRNVC3PR9Ku5X2Oa4aVbSdsHY3Q2NwPMh6d6naeZKVR5l/N oFXzdfqAFFaoqojO9/eCWQKBgQC1/8XNlnSjHg9RUnAzmxrq5EHO4HOcFOIjEMDF fGOazUgf5yo4Dsax/m4IcaybQ8KnsEMhfQk9NtDl8a5v7nftRV7xpfETGyBgpdqD LH+Yfih5Deo1aonsGeT+8LGukpnYhV9QbvQcmVN121050fQY6wE28cFVNotjuajB 1L2r6QKBgQCVgzVxU11bsGtFuphIKsZ7D6ptIxbiQ1x1iiM1dbnOW1PxLT/UCaUr ceRov28FPDbpmh3L5af80dB62a8uKmtqQcUSLdm1gbM6LmvTl8kGLmgK66qmcX8n 1fR9yomrJao5CFgY/LZnGkJFfNvOV+crapX9PIajJWOcEfqEynyo+w== -----END RSA PRIVATE KEY----- [secdemo]> select appid,publickey from secdemo.apppublickey¥G *************************** 1. row *************************** appid: 1 publickey: -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEApOJW4XusZ5vGKgoK/Q/3CPpMDegafghDNMxG6whiAj0E3aBhgtXJ xDz6faG6by8+IXPVhLiVAb4cKixYGQMzIh0Edsh5/5pGpsSF4dwGzyjX8oEljG1K Thco+PbtYCNZd8OkKtUiXFsv0/ZuNHKUZ1Fg2RKe3qKZIaWgKqQXlJeOUA5odMTw HsT20pBHWGp4O+txwtO1dGO5UvApXmMX/mufxkEb94h4+rhYPRLSAaW2co1XKtHC cHR9eWL/RkE1ZdULrf9GxALtFxX17gNPaexBVIBZ06MEzQ+ff38nL6sefNsezM+R FrNEFX+qK5r9GTAgbSjPTNmFnsnrvM/JKQIDAQAB -----END RSA PUBLIC KEY----- SET @key_len = 2048; SET @algo = 'RSA'; SET @priv = CREATE_ASYMMETRIC_PRIV_KEY(@algo, @key_len); select @priv; INSERT INTO `secdemo`.`privuserprivatekey` (`appid`,`privatekey`) VALUES (1, @priv); SET @pub = CREATE_ASYMMETRIC_PUB_KEY(@algo, @priv); INSERT INTO `secdemo`.`apppublickey` (`appid`,`publickey`) VALUES (1, @pub); AESパスフレーズを 解読する為のキー AESパスフレーズを 暗号化する為のキー 非対称鍵の作成
  • 10. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | /* Web Client – Get Public Key (connected as appuser) */ /* Web Client – Generate passphrase */ /* SET @passphrase = keyring_key_generate('MyKey', 'AES', 32); */ /* Web Client – Encrypt Data with passphrase */ /* Web Client – Encrypt passphrase with Public Key */ 10 appuser@localhost [secdemo]> select 'Symmetric Passphrase', @passphrase¥G *************************** 1. row *************************** Symmetric Passphrase: Symmetric Passphrase @passphrase: 2555f21178e18b6ec5f883ddb5fad6992f34ece0d83a217e27063fe9 1 row in set (0.00 sec) appuser@localhost [secdemo]> select HEX(@enc_keepsecret)¥G *************************** 1. row *************************** HEX(@enc_keepsecret): 3FFB3865894C83DE4356675A12C46638518D77223775729FC81461EC5534CAF409F6E3 4D0DB1852F7CD6341E1E38907FA94E03851118B7C4555AC2156E2E2E64958A3BF8F43 0348AE07874B49E7FF997 1 row in set (0.00 sec) appuser@localhost [secdemo]> SELECT 'Decrypt just to check', AES_DECRYPT(@enc_keepsecret, @passphrase)¥G *************************** 1. row *************************** Decrypt just to check: Decrypt just to check AES_DECRYPT(@enc_keepsecret, @passphrase): Santa and his Elves location is just north east of Longyearbyen, Norway appuser@localhost [secdemo]> select 'Encrypted passphrase by using public key', HEX(@enc_pp)¥G *************************** 1. row *************************** Encrypted passphrase by using public key: Encrypted passphrase by using public key HEX(@enc_pp): 3AFCABA8D8FED44A548EEC89D8BF1024FBAAF40DEE078498A58BB11A2C6545958A41E7A44F 93A723C56751496BB830EEA714F44B18C52F7905C2E6F6733FFCFFDC80049A613575B6884C74 C82888C9D36A1E067ECF9200BBB102040BBA6AE944F51AE3AE137B7FD88455CF2833D978340 E0EB104A8F98DD6655AB520D2FE2C6EDA88B34B4D7ADE72ABA8734B75C0745CF21D81590FE D309B80CB5B4E5F7B59A15AE2418D6945017CB409F8568F7C96B297729F33F638232230D207A FB22245D91B65DBAD1C9AAE8A28ECEAD7FBF6D9E3FED486FBE89B40D891FA8112347758191 D0805638649143DADC1A1F3F1CB914333B10E24EAA8BF0F5F1A51DFB40396C8 Encrypt Passphrase by Public Key SET @key_len = 2048; SET @algo = 'RSA'; Set @enc_pp = ASYMMETRIC_ENCRYPT(@algo, @passphrase, @webpubkey); SELECT 'Encrypted passphrase by using public key', HEX(@enc_pp)¥G SET @keepsecret='Santa and his Elves location is just north east of Longyearbyen, Norway'; select @keepsecret; SET @enc_keepsecret=AES_ENCRYPT(@keepsecret,@passphrase); SELECT @enc_keepsecret; INSERT INTO `secdemo`.`secretsdata` (`id`,`secret`) VALUES (1, @enc_keepsecret); SELECT 'Decrypt just to check', AES_DECRYPT(@enc_keepsecret, @passphrase); SET @passphrase = SHA2(lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0), 224); select 'Symmetric Passphrase', @passphrase; select publickey from `secdemo`.`apppublickey` where appid=1 INTO @webpubkey; select 'web public key', @webpubkey; AESパスフレーズは常に ランダムに生成されます ハンズオン:ステップ⑤ : データの暗号化
  • 11. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | /* Server - Store AES Data and PK Encrypted Passphrase */ /* Look at key (you can't no permission and even if could - its encrypted */ /* Look at data - its encrypted */ 11 trusteduser@localhost [secdemo]> select id,hex(secretkey) from secdemo.secretskey¥G *************************** 1. row *************************** id: 1 hex(secretkey): 3AFCABA8D8FED44A548EEC89D8BF1024FBAAF40DEE078498A58BB11A2C6545958A41E7A44F 93A723C56751496BB830EEA714F44B18C52F7905C2E6F6733FFCFFDC80049A613575B6884C74 C82888C9D36A1E067ECF9200BBB102040BBA6AE944F51AE3AE137B7FD88455CF2833D978340 E0EB104A8F98DD6655AB520D2FE2C6EDA88B34B4D7ADE72ABA8734B75C0745CF21D81590FE D309B80CB5B4E5F7B59A15AE2418D6945017CB409F8568F7C96B297729F33F638232230D207A FB22245D91B65DBAD1C9AAE8A28ECEAD7FBF6D9E3FED486FBE89B40D891FA8112347758191 D0805638649143DADC1A1F3F1CB914333B10E24EAA8BF0F5F1A51DFB40396C8 1 row in set (0.00 sec) appuser@localhost [secdemo]> select id,hex(secret) from `secdemo`.`secretsdata`¥G *************************** 1. row *************************** id: 1 hex(secret): 3FFB3865894C83DE4356675A12C46638518D77223775729FC81461EC5534CAF409F6E34D0DB1 852F7CD6341E1E38907FA94E03851118B7C4555AC2156E2E2E64958A3BF8F430348AE07874B4 9E7FF997 1 row in set (0.00 sec) Encrypt AES Passphrase by Public Key INSERT INTO `secdemo`.`secretskey` (`id`, `secretkey`) VALUES (1, @enc_pp); appuser@localhost [secdemo]> select id,hex(secretkey) from secdemo.secretskey¥G ERROR 1142 (42000): SELECT command denied to user 'appuser'@'localhost' for table 'secretskey' select id,hex(secret) from `secdemo`.`secretsdata`¥G データはAES()によって 暗号化されている 公開鍵で暗号化された AESパスフレーズを保存 appuserはパスフレーズを、 読むことが出来なくなりました Encrypted data by AES Passphrase ハンズオン:ステップ⑥ : 暗号化したデータの保存
  • 12. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | Web App開発時のメリット • 暗号化鍵を保存しません(挿入するたびにランダムに生成されます) • エクスポーズできるハードコーディングされたキーは不要 – 設定ファイルにキー埋め込み不要 – 鍵のローテーションが不要 • 暗号化後にデータを解読することは出来ない – アプリがメモリ内にキーを保存しない限り 12
  • 13. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | /* 管理者アカウント – Read PK Encrypted Passphrase */ /* 管理者アカウント– Get Private Key */ /*管理者アカウント– Decrypt passphrase with Private Key */ /*管理者アカウント– Read AES Encrypted Data */ /*管理者アカウント– See Secret Data */ /*管理者アカウント– Decrypt data with Passphrase */ 13 trusteduser@localhost [secdemo]> select 'privappprivpkey', @privappprivpkey¥G *************************** 1. row *************************** privappprivpkey: privappprivpkey @privappprivpkey: -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEApOJW4XusZ5vGKgoK/Q/3CPpMDegafghDNMxG6whiAj0E3aBh gtXJxDz6faG6by8+IXPVhLiVAb4cKixYGQMzIh0Edsh5/5pGpsSF4dwGzyjX8oEl jG1KThco+PbtYCNZd8OkKtUiXFsv0/ZuNHKUZ1Fg2RKe3qKZIaWgKqQXlJeOUA5o dMTwHsT20pBHWGp4O+txwtO1dGO5UvApXmMX/mufxkEb94h4+rhYPRLSAaW2co1 <SNIP> oFXzdfqAFFaoqojO9/eCWQKBgQC1/8XNlnSjHg9RUnAzmxrq5EHO4HOcFOIjEMDF fGOazUgf5yo4Dsax/m4IcaybQ8KnsEMhfQk9NtDl8a5v7nftRV7xpfETGyBgpdqD LH+Yfih5Deo1aonsGeT+8LGukpnYhV9QbvQcmVN121050fQY6wE28cFVNotjuajB 1L2r6QKBgQCVgzVxU11bsGtFuphIKsZ7D6ptIxbiQ1x1iiM1dbnOW1PxLT/UCaUr ceRov28FPDbpmh3L5af80dB62a8uKmtqQcUSLdm1gbM6LmvTl8kGLmgK66qmcX8n 1fR9yomrJao5CFgY/LZnGkJFfNvOV+crapX9PIajJWOcEfqEynyo+w== -----END RSA PRIVATE KEY----- trusteduser@localhost [secdemo]> select 'Original Symmetric Passphrase', @enc_pp¥G *************************** 1. row *************************** Original Symmetric Passphrase: Original Symmetric Passphrase @enc_pp: 2555f21178e18b6ec5f883ddb5fad6992f34ece0d83a217e27063fe9 1 row in set (0.00 sec) trusteduser@localhost [secdemo]> select AES_DECRYPT(secret, @enc_pp) from `secdemo`.`secretsdata` where id=1¥G *************************** 1. row *************************** AES_DECRYPT(secret, @enc_pp): Santa and his Elves location is just north east of Longyearbyen, Norway 1 row in set (0.00 sec) trusteduser@localhost [secdemo]> select secretkey from `secdemo`.`secretskey` where id=1 INTO @encpassphrase; select privatekey from `secdemo`.`privuserprivatekey` where appid=1 INTO @privappprivpkey; select 'privappprivpkey', @privappprivpkey; SET @key_len = 2048; SET @algo = 'RSA'; Set @enc_pp = ASYMMETRIC_DECRYPT(@algo, @encpassphrase, @privappprivpkey); select 'Original Symmetric Passphrase', @enc_pp; select id,hex(secret) from `secdemo`.`secretsdata`; select AES_DECRYPT(secret, @enc_pp) from `secdemo`.`secretsdata` where id=1; ハンズオン:ステップ⑦ :暗号化されたデータの参照
  • 14. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | 14 Application Use Private key For Decrypting AES Passphrase. Then decrypt encrypted data with AES_ENCRYPT(). AES_ENCRYPT() AES_DECRYPT() 1) Encrypt data with AES_ENCRYPT() AES Passphrase is always generated randomly. SET @passphrase = SHA2(lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0), 224); 2) Use the public key for encrypting AES passphrase. 3) Encrypted passphrase is inserted by appuser. ※ appuser doesn’t have “select” authentication.Encrypted Data Encrypted passphrase Appuser Trusteduser For Rotating Passphrase: 1) Decrypt AES Passphrase with current private key. 2) Encrypt AES Passphrase with new public key. ① 暗号鍵をランダムに 生成しデータを暗号化し保存 ② “①”で生成した 暗号鍵を Public鍵で暗号化して保存 ③暗号化された鍵を Private鍵で復号化しデータを参照
  • 15. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | 15 appuser@localhost [secdemo]> SET @key_len = 2048;SET @algo = 'RSA'; appuser@localhost [secdemo]> SET @passphrase = SHA2(lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0), 224); appuser@localhost [secdemo]> SET @keepsecret='This is confidential data 2nd connection by appuser'; appuser@localhost [secdemo]> SET @enc_keepsecret=AES_ENCRYPT(@keepsecret,@passphrase); appuser@localhost [secdemo]> INSERT INTO `secdemo`.`secretsdata` (`id`,`secret`) VALUES (2, @enc_keepsecret); appuser@localhost [secdemo]> select publickey from `secdemo`.`apppublickey` where appid=1 INTO @webpubkey; appuser@localhost [secdemo]> Set @enc_pp = ASYMMETRIC_ENCRYPT(@algo, @passphrase, @webpubkey); appuser@localhost [secdemo]> INSERT INTO `secdemo`.`secretskey` (`id`, `secretkey`) VALUES (2, @enc_pp); trusteduser@localhost [secdemo]> SET @key_len = 2048;SET @algo = 'RSA'; trusteduser@localhost [secdemo]> select secretkey from `secdemo`.`secretskey` where id=2 INTO @encpassphrase; trusteduser@localhost [secdemo]> select privatekey from `secdemo`.`privuserprivatekey` where appid=1 INTO @privappprivpkey; trusteduser@localhost [secdemo]> Set @enc_pp = ASYMMETRIC_DECRYPT(@algo, @encpassphrase, @privappprivpkey); trusteduser@localhost [secdemo]> select AES_DECRYPT(secret, @enc_pp) from `secdemo`.`secretsdata` where id=2; +-----------------------------------------------------+ | AES_DECRYPT(secret, @enc_pp) | +-----------------------------------------------------+ | This is confidential data 2nd connection by appuser | +-----------------------------------------------------+ trusteduser@localhost [secdemo]> select id,left(hex(secretkey),100) from secretskey; +----+------------------------------------------------------------------------------------------------------+ | id | left(hex(secretkey),100) | +----+------------------------------------------------------------------------------------------------------+ | 1 | 3AFCABA8D8FED44A548EEC89D8BF1024FBAAF40DEE078498A58BB11A2C6545958A41E7A44F93A723C56751496BB830EEA714 | | 2 | 692B0B30335A81CF5836A5EE090593CC71EC18690EBE3A40D1128289ECCC177FD7F64729A46227C6B8701CE7C52876C9B672 | +----+------------------------------------------------------------------------------------------------------+ ① 暗号鍵をランダムに 生成しデータを暗号化し保存 ② “①”で生成した 暗号鍵を Public鍵で暗号化して保存 ③暗号化された鍵を Private鍵で復号化しデータを参照 こちらの鍵を復号化&暗号化する事で鍵の定期的なローテーションを行う
  • 16. Copyright © 2017 Oracle and/or its affiliates. All rights reserved. | 16 Thank You 運用に合わせて適宜、カスタマイズして活用下さい。