DECRYPT_BIN および DECRYPT_CHAR スカラー関数
DECRYPT_BIN 関数と DECRYPT_CHAR 関数はどちらも、 encrypted-data 暗号化解除の結果である値を返します。
スキーマは SYSIBM です。
暗号化解除に使用されるパスワードは、password-string-expression、 または SET ENCRYPTION PASSWORD ステートメントで割り当てられた暗号化パスワード値のいずれかです。 システムで最高レベルのセキュリティーを維持するためには、照会内で DECRYPT_BIN と DECRYPT_CHAR 関数を使用して暗号化パスワードを明示的に受け渡さずに、代わりに、SET ENCRYPTION PASSWORD ステートメントを使用してパスワードを設定し、SET ENCRYPTION PASSWORD ステートメントの使用時にリテラル・ストリングではなく、ホスト変数または動的パラメーター・マーカーを使用することをお勧めします。
DECRYPT_BIN および DECRYPT_CHAR 関数は、 ENCRYPT 関数を使って暗号化された値のみを暗号化解除できます (SQLSTATE 428FE)。
- encrypted-data
- CHAR FOR BIT DATA 値または VARCHAR FOR BIT DATA 値を、 暗号化された完全なデータ・ストリングとして戻す式です。 データ・ストリングは、ENCRYPT 関数を使って暗号化されたものでなければなりません。
- password-string-expression
- 少なくとも 6 バイトで 127 バイトを超えない CHAR または VARCHAR 値を返す式です (SQLSTATE 428FC)。 この式は、データの暗号化に使用されたパスワードと同じでなければなりません (SQLSTATE 428FD)。 パスワード引数が NULL、または与えられていない場合、SET ENCRYPTION PASSWORD ステートメントによってセッションに割り当てられた暗号化パスワード値を使用してデータが暗号化解除されます (SQLSTATE 51039)。
DECRYPT_BIN 関数の結果は VARCHAR FOR BIT DATA です。 DECRYPT_CHAR 関数の結果は VARCHAR です。 encrypted-data にヒントが組み込まれている場合、そのヒントは関数によって返されません。 結果の長さ属性は、encrypted-data のデータ・タイプの長さマイナス 8 バイトになります。 関数によって実際に返される長さの値は、暗号化されたオリジナル・ストリングの長さに一致します。 暗号化ストリングを超えるバイトが encrypted-data に入っている場合、 それらのバイトは関数によって返されません。
最初の引数が NULL になる可能性がある場合、結果も NULL になる可能性があります。 最初の引数が NULL の場合には、結果も NULL 値です。
データが暗号化されたときのコード・ページとは異なるコード・ページを使用する、 別のシステムでデータが暗号化解除された場合、 暗号化解除された値をデータベース・コード・ページに変換するとき、 長さが超過してしまう可能性があります。 この場合、encrypted-data 値を より大きなバイト数の VARCHAR ストリングに cast する必要があります。
例
- 例 1: 以下の例では、組み込み SQL アプリケーション内のコード部分を示して、DECRYPT_CHAR 関数の使用法を示します。
EXEC SQL BEGIN DECLARE SECTION; char hostVarCreateTableStmt[100]; char hostVarSetEncPassStmt[200]; char hostVarPassword[128]; char hostVarInsertStmt1[200]; char hostVarInsertStmt2[200]; char hostVarSelectStmt1[200]; char hostVarSelectStmt2[200]; EXEC SQL END DECLARE SECTION; /* prepare the statement */ strcpy(hostVarCreateTableStmt, "CREATE TABLE EMP (SSN VARCHAR(24) FOR BIT DATA)"); EXEC SQL PREPARE hostVarCreateTableStmt FROM :hostVarCreateTableStmt; /* execute the statement */ EXEC SQL EXECUTE hostVarCreateTableStmt; - 例 2: 以下のように、SET ENCRYPTION PASSWORD ステートメントを使用して、セッションの暗号化パスワードを設定します。
/* prepare the statement with a parameter marker */ strcpy(hostVarSetEncPassStmt, "SET ENCRYPTION PASSWORD = ?"); EXEC SQL PREPARE hostVarSetEncPassStmt FROM :hostVarSetEncPassStmt; /* execute the statement for hostVarPassword = 'Pac1f1c' */ strcpy(hostVarPassword, "Pac1f1c"); EXEC SQL EXECUTE hostVarSetEncPassStmt USING :hostVarPassword; /* prepare the statement */ strcpy(hostVarInsertStmt1, "INSERT INTO EMP(SSN) VALUES ENCRYPT('289-46-8832')"); EXEC SQL PREPARE hostVarInsertStmt1 FROM :hostVarInsertStmt1; /* execute the statement */ EXEC SQL EXECUTE hostVarInsertStmt1; /* prepare the statement */ strcpy(hostVarSelectStmt1, "SELECT DECRYPT_CHAR(SSN) FROM EMP"); EXEC SQL PREPARE hostVarSelectStmt1 FROM :hostVarSelectStmt1; /* execute the statement */ EXEC SQL EXECUTE hostVarSelectStmt1;この照会は、値 '289-46-8832' を返します。
- 例 3: 以下のように、暗号化パスワードを明示的に渡します。
/* prepare the statement */ strcpy(hostVarInsertStmt2, "INSERT INTO EMP (SSN) VALUES ENCRYPT('289-46-8832',?)"); EXEC SQL PREPARE hostVarInsertStmt2 FROM :hostVarInsertStmt2; /* execute the statement for hostVarPassword = 'Pac1f1c' */ strcpy(hostVarPassword, "Pac1f1c"); EXEC SQL EXECUTE hostVarInsertStmt2 USING :hostVarPassword; /* prepare the statement */ strcpy(hostVarSelectStmt2, "SELECT DECRYPT_CHAR(SSN,?) FROM EMP"); EXEC SQL PREPARE hostVarSelectStmt2 FROM :hostVarSelectStmt2; /* execute the statement for hostVarPassword = 'Pac1f1c' */ strcpy(hostVarPassword, "Pac1f1c"); EXEC SQL EXECUTE hostVarSelectStmt2 USING :hostVarPassword;この照会は、値 '289-46-8832' を返します。
