Always Encryptedで暗号化されたカラムを格納するのに必要なバイト数の情報は、以下のサイトに記載されている。
https://docs.microsoft.com/ja-jp/sql/relational-databases/security/encryption/always-encrypted-cryptography?view=sql-server-ver15
上記サイトを確認すると、暗号化した後の文字列のバイト数は、VARCHAR型の文字列の場合、以下の計算式で計算できる。
1 + 32 + 16 + (FLOOR(DATALENGTH(cell_data)/16) + 1) * 16
例えば、暗号化前の文字列がVARCHAR(16)の場合、暗号化した後の文字列のバイト数は、
1 + 32 + 16 + (FLOOR(16/16) + 1) * 16 = 1 + 32 + 16 + 2 * 16 = 81 となり、
暗号化した後の文字列は、実際、VARCHAR(81)のデータ型に格納できる。
今回は、16文字の暗号化した文字列を、VARCHAR型、文字列長81のデータ型に格納してみたので、その手順を共有する。
前提条件
下記記事の実装が完了していること。
やってみたこと
USER_PASSテーブルの再作成
前提条件で作成したUSER_PASSテーブルは、暗号化前文字列長が16、暗号化後文字列長が81になっていないため、USER_PASSテーブルを再作成する。その手順は以下の通り。
1) USER_PASSテーブルを削除するため、以下のSQLを実行する。
1 | drop table dbo.USER_PASS; |
2) USER_PASSテーブルを作成するため、以下のSQLを実行する。
1 2 3 4 5 | create table dbo.USER_PASS( id int PRIMARY KEY NOT NULL, pass VARCHAR(16), pass_encrypted VARCHAR(81) ); |
3) USER_PASSテーブルにデータを追加する。
1 | insert into dbo.USER_PASS(id, pass, pass_encrypted) values (1, 'pass', 'pass'); |
4) USER_PASSテーブルの追加されたデータを確認する。
1 | select * from dbo.USER_PASS; |
5) USER_PASSテーブルのカラム「pass_encrypted」を暗号化する。
その手順は、以下の記事の「SSMSを使ったAlways Encryptedによるカラム暗号化」を参照のこと。
6) USER_PASSテーブルの暗号化されたデータを確認する。
1 | select * from dbo.USER_PASS; |
暗号化文字列の更新
パスワード・暗号化したパスワードの更新は、下記記事のプログラムを利用して行う。
今回は、パスワードを16文字の「12345abcdeABCDE1」に更新し、ローカル環境で実行するものとする。
1) ローカル環境のApp Service、Azure Functionsを起動し、「http:// (ホスト名):(ポート番号)」とアクセス後、パスワード「12345abcdeABCDE1」を指定し「UserPassを更新」ボタンを押下する。
2) パスワードが更新され、以下の画面が表示される。その後「getUserPassの値を取得」ボタンを押下する。
3) 以下のように、更新後パスワードが表示されることが確認できる。
暗号化文字列のバイト数確認
パスワードと暗号化したパスワードの更新後結果を確認する。その手順は、以下の通り。
1) USER_PASSテーブルのデータを確認すると、以下のように、画面で指定した通りに、パスワード・暗号化したパスワードが更新されていることが確認できる。
1 | select * from dbo.USER_PASS; |
2) パスワード・暗号化したパスワードのバイト数を確認すると、以下のように、暗号化前のパスワード文字列が16バイト、暗号化後のパスワード文字列が81バイトであることが確認できる。
1 2 | select DATALENGTH(pass) AS pass_len, DATALENGTH(pass_encrypted) AS pass_endrypted_len from dbo.USER_PASS |
要点まとめ
- Always Encryptedで暗号化されたカラムを格納するための文字列のバイト数は、特定の計算式で計算できる。
- VARCHAR型の文字列の場合は、Always Encryptedで暗号化されたカラムを、VARCHAR(算出したバイト数)のデータ型に格納できる。