顧客データを暗号化したときの備忘録です。
カラムの文字数制限について
Base64で暗号化をすると平文より文字数が増えます。
そのため既存のDBのカラム定義だと保存できない問題がありました。
暗号化アルゴリズムについて
対応としてはDBのカラム定義(VARCHAR)の長さを増やして対応します。
使っている暗号化アルゴリズムはBlock Cipher
(AES 256 Encryption)であり、Block Cryption
は入力された値の長さによりブロック分けして暗号化するので暗号化された値の文字数はそのブロックにより異なります。
Base64変換後の文字列サイズは以下の式で求まります。参考: BlockCryption
(変換後のバイト数) = (文字数 * バイト数) + ブロック数 - MOD(文字数 * バイト数, ブロック数)
以下公式内の変数の説明。
- 文字数:入力文字列の文字数。
- バイト数:一般的に文字のサイズは以下の通り。
| UTF-8 | バイト数 |
|:-:|:-:|:-:|
| 英文字 | 2 Bytes |
| ひらがな or カタカナ | 3 Bytes |
| 漢字 | 3 or 4 Bytes |
- ブロック数:入力文字列によりブロックが設定される(文字数1〜7→16,文字数8~15→32, etc.)
凡例
名前の入力値は50文字で上限を掛けているのでこの値で計算してみます。
アルファベット | ひらがな or カタカナ | 漢字 | |
---|---|---|---|
文字数 | 50 | 50 | 50 |
バイト数(Byte) | 2 | 3 | 4 |
ブロック数 | 16 | 16 | 16 |
式 | (502)+16-MOD(502,16) | (503)+16-MOD(503,16) | (504)+16-MOD(504,16) |
サイズ(Byte) | 152 | 216 | 280 |
結論
以上から50文字上限なら280のバイト数を設定すればよさそうです。
他のカラムについても同様に計算ができます。