【Oracle Database】暗号化の前後でデータファイルを見比べてみた（透過的データ暗号化・TDE）

## はじめに
* テスト用のユーザーを作成し、表領域を暗号化する前と暗号化した後のデータファイルをstringsで確認します。

## 大まかな流れ
1. 暗号化対象の表領域を作成
1. PDBに学習用ユーザーを作成
1. 学習用ユーザーで表を作成
1. 暗号化する前のデータファイルを確認
1. 暗号化する
1. 暗号化した後のデータファイルを確認

## 手順
### 1. 暗号化対象の表領域を作成
* sysユーザで接続
```
[oracle@devdays-23c ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Thu Apr 11 23:19:32 2024
Version 23.3.0.23.09

Copyright (c) 1982, 2023, Oracle.  All rights reserved.


Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
```

* PDBに接続
```sql
SQL> alter session set container = FREEPDB1 ;

Session altered.
```

* 元から存在する表領域とデータファイルを確認
```sql
SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS

SQL> SELECT file_name FROM dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/FREE/users01.dbf
/opt/oracle/oradata/FREE/undotbs01.dbf
/opt/oracle/oradata/FREE/system01.dbf
/opt/oracle/oradata/FREE/sysaux01.dbf
```



* 表領域`mytbs`を作成
```sql
SQL> create tablespace mytbs datafile '/opt/oracle/oradata/FREE/FREEPDB1/mytbs01.dbf' size 100m autoextend off ;

Tablespace created.
```
* 作成した表領域とデータファイルがあるか確認
```sql
SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
MYTBS　#今回作成した表領域

6 rows selected.

SQL> SELECT file_name FROM dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/FREE/FREEPDB1/sysaux01.dbf
/opt/oracle/oradata/FREE/FREEPDB1/users01.dbf
/opt/oracle/oradata/FREE/FREEPDB1/mytbs01.dbf　#今回作成したデータファイル
/opt/oracle/oradata/FREE/FREEPDB1/system01.dbf
/opt/oracle/oradata/FREE/FREEPDB1/undotbs01.dbf

```

### 2. PDBに学習用ユーザーを作成

* 学習用ユーザを作成する
```sql
SQL> create user ritsuko identified by WelCome123#123# default tablespace MYTBS;

User created.
```

* 作成したユーザがあるか確認
```sql
SQL> select username from dba_users where username = 'RITSUKO';   

USERNAME
--------------------------------------------------------------------------------
RITSUKO
```

* 権限を付ける
```sql
SQL> grant connect to ritsuko;

Grant succeeded.

SQL> grant resource to ritsuko;

Grant succeeded.

SQL> grant dba to ritsuko;

Grant succeeded.
```

### 3. 学習用ユーザーで表を作成
* 一度ログアウトし、学習用ユーザでPDBに接続

```
[oracle@devdays-23c ~]$ sqlplus ritsuko/WelCome123#123#@localhost:1521/FREEPDB1

SQL*Plus: Release 23.0.0.0.0 - Production on Thu Apr 11 23:27:58 2024
Version 23.3.0.23.09

Copyright (c) 1982, 2023, Oracle.  All rights reserved.


Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
```

* テーブルを作成する

ちなみに今回は以下の内容のテーブルを作成する
| CUSTOMER_ID | NAME | CARD_ID |
|:-:|:-:|:-:|
| 1  |  yamada | 5555-4444-3333-2222  |
| 2 | tanaka  |  6666-4444-3333-2222 |
| 3 |  yamamoto | 7777-4444-3333-2222  |
| 4 |yamada   | 8888-4444-3333-2222  |
| 5 | yamada  |9999-4444-3333-2222   |
| 6 | yamada  | 1999-4444-3333-2222  |
| 7 | arima  |   2999-4444-3333-2222  |
| 8 | minami  | 3999-4444-3333-2222  |
| 9 |kita   |   4999-4444-3333-2222 |
| 10 | nishi  | 5999-4444-3333-2222|


```sql
SQL> create table customer(
customer_id number(3) primary key,
name varchar2(10 char) not null,
card_id varchar2(25 char)
 );  2    3    4    5  

Table created.

SQL> select table_name from user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
CUSTOMER

```

* データをinsert
以下を参考に10行データを入れる
```sql
SQL> INSERT INTO customer (
        customer_id, name, card_id
) VALUES (
        '001', 'yamada' ,'5555-4444-3333-2222'
) ;  2    3    4    5  

1 row created.

SQL> select * from customer;

CUSTOMER_ID NAME       CARD_ID
----------- ---------- -------------------------
          1 yamada     5555-4444-3333-2222
          

```

* 10行格納されていることの確認
```sql
SQL> select * from customer;    

CUSTOMER_ID NAME       CARD_ID
----------- ---------- -------------------------
          1 yamada     5555-4444-3333-2222
          2 tanaka     6666-4444-3333-2222
          3 yamamoto   7777-4444-3333-2222
          4 yamada     8888-4444-3333-2222
          5 yamada     9999-4444-3333-2222
          6 yamada     1999-4444-3333-2222
          7 arima      2999-4444-3333-2222
          8 minami     3999-4444-3333-2222
          9 kita       4999-4444-3333-2222
         10 nishi      5999-4444-3333-2222

10 rows selected.

SQL> 
```



### 4. 暗号化する前のデータファイルを確認

* データファイルをstringsする
```
[oracle@devdays-23c ~]$ cd /opt/oracle/oradata/FREE/FREEPDB1
[oracle@devdays-23c FREEPDB1]$ ls
mytbs01.dbf  sysaux01.dbf  system01.dbf  temp01.dbf  undotbs01.dbf  users01.dbf
[oracle@devdays-23c FREEPDB1]$ strings mytbs01.dbf
}|{z
UFREE
1~EDu 
MYTBS
AAAAAAAA
AAAAAAAA
AAAAAAAA
nishi
5999-4444-3333-2222,
kita
4999-4444-3333-2222,
minami
3999-4444-3333-2222,
arima
2999-4444-3333-2222,
yamada
1999-4444-3333-2222,
yamada
9999-4444-3333-2222,
yamada
8888-4444-3333-2222,
yamamoto
7777-4444-3333-2222,
tanaka
6666-4444-3333-2222,
yamada
5555-4444-3333-2222
AAAAAAAA
[oracle@devdays-23c ~]$ 

```
### 5. 暗号化する

暗号化の手順は以下の記事にまとめたので、そちらを参考に対象PDBを暗号化してください。

[Oracle DatabaseでTDE（透過的データ暗号化）を試してみた](https://qiita.com/ritokuna/items/67f0e4685e12021e8f66)


### 6. 暗号化した後のデータファイルを確認


* 暗号化したデータファイルを確認する
結果が長くて折りたたんでますが、先ほどと違い解読できる文字や数字が無いのが確認できます。
```
[oracle@devdays-23c FREEPDB1]$ strings mytbs01.dbf
```
<details><summary>stringsの結果</summary>
```rb
[oracle@devdays-23c FREEPDB1]$ strings mytbs01.dbf
XWrZ
2Io_
fv4{
l%\(
Y?OH
0-jc
<;FD#
tc+t
4b3'
wO'Q
k%A/
qF(Qw
AXvX
<AqHO)
?@"e
1Fi%4
q[e<gz
~FZh
%       eq
vQnp
{}-7
#/L6A
)`\]
tG7J
P=_i/H
nK}Y
HR.Sp
wjNwK
52rSZ
;zxv
mMcY
;h?"
%I`c;l
t:b~
)~,a
q?oN
\.o#Z2
uh}99
Aq_o
kU1yi
ZD7k
@44g)
vSm 
v:NyU
pDt?m
.0;3~
91*m
J%Jt
{szb
w       W}`=
g kq
n$k%ry
&*(v*)
*E$5
(JUYL
d'Ar
 AW"
XYtBU
:Bly
p@?%sy
A6@3i
I0$\
K_|Z
wBBB
4Xld 
j>3D
>dfF%
S%4+E
%0<{
{9&:
R/C-
24Kg
5UQk
iwN*jU
j       {7d5N
R&8*
l^8V
Y)\0M
iW0A
9/KO
4i\F
7nVKt
b-X(/
YLv/
fr/k\
        ]cMNA
B`      `
xHVE
^%]u
ofS.
YQE@DZ
caNl@
]a5_
|XdO:
v=|4
r!p:
`D9 j
R0 PW
?+CCl
*^cxwDp
CALQZ]
ZBO_
dI!1'w_
s~o(
Jc%ph
nO|8
        ,/f
fFRP
^3j\
cA?QDS~N-
7`J=
d),E
_.)Wc
Ct-$5$
E{*gX
j=6h
4\P]d
vbM9
^F"~h
kdsu
uQ?6
D;N5
IhqeZ&
s0Dg,bI
[.ER~
.VSy=Y
;,s'
Gr3U
[oracle@devdays-23c FREEPDB1]$ 
```
</details>