ENCRYPT スカラー関数

ENCRYPT 関数は、data-string-expression 暗号化の結果である値を返します。

重要: ENCRYPT 関数は非推奨になっており、将来のリリースでは使用されない可能性があります。

使用されているアルゴリズムは NIST SP 800-131A に準拠していません。

注: AIXでこの機能を使用する場合は、 パフォーマンスの考慮事項について以下を確認してください。
Read syntax diagramSkip visual syntax diagramENCRYPT(data-string-expression ,password-string-expression,hint-string-expression )

スキーマは SYSIBM です。

暗号化に使用されるパスワードは、password-string-expression、 または SET ENCRYPTION PASSWORD ステートメントで割り当てられた暗号化パスワード値のいずれかです。 システムで最高レベルのセキュリティーを維持するためには、照会内で ENCRYPT 関数を使用して暗号化パスワードを明示的に受け渡さずに、代わりに、SET ENCRYPTION PASSWORD ステートメントを使用してパスワードを設定し、SET ENCRYPTION PASSWORD ステートメントの使用時にリテラル・ストリングではなく、ホスト変数または動的パラメーター・マーカーを使用することをお勧めします。

Unicode データベースでは、指定した引数が GRAPHIC ストリングであると、 まず文字ストリングに変換されてから、関数が実行されます。

データ・ストリング式
暗号化する CHAR または VARCHAR 値を返す式です。 data-string-expression のデータ・タイプの長さ属性は、 hint-string-expression 引数がなければ 32663 に、 hint-string-expression 引数が指定されていれば 32631 に制限されています (SQLSTATE 42815)。
パスワード・ストリング式
少なくとも 6 バイトで 127 バイトを超えない CHAR または VARCHAR 値を返す式です (SQLSTATE 428FC)。 この値は、data-string-expression を暗号化するために使用されるパスワードを表します。 パスワード引数の値が NULL、または与えられていない場合、SET ENCRYPTION PASSWORD ステートメントによってセッションに割り当てられた暗号化パスワード値を使用してデータが暗号化されます (SQLSTATE 51039)。
ヒント・ストリング式 (hint-string-expression)
データ所有者がパスワードを思い出す (例えば、'Ocean' が 'Pacific' を 思い出すヒントになります) ために役立つ、32 バイトまでの CHAR または VARCHAR 値を返す式です。 ヒントの値が与えられると、そのヒントは結果に組み込まれ、GETHINT 関数を使用して取り出すことができます。 この引数が NULL、または与えられていない場合、ヒントは結果に組み込まれません。
関数の結果データ・タイプは VARCHAR FOR BIT DATA です。
  • オプションのヒント・パラメーターが指定されている場合、結果の長さ属性は、暗号化されていないデータの長さ属性 + 8 バイト + 次の 8 バイト境界までのバイト数 + ヒントの長さの 32 バイトと等しくなります。
  • オプションのヒント・パラメーターが指定されていない場合、結果の長さ属性は、暗号化されていないデータの長さ属性 + 8 バイト + 次の 8 バイト境界までのバイト数と等しくなります。

最初の引数が NULL になる可能性がある場合、結果も NULL になる可能性があります。 最初の引数が NULL の場合には、結果も NULL 値です。

暗号化された結果が data-string-expression 値よりも長くなることに注意してください。 そのため、暗号化された値を割り当てる際、その暗号化された値全体が入るだけの 十分なサイズでターゲットを宣言してください。

  • 暗号化アルゴリズム: 内部暗号化アルゴリズムは埋め込み付きの RC2 ブロック暗号で、128 ビットの秘密鍵は MD5 メッセージ・ダイジェストによってパスワードから派生します。
  • 暗号化パスワードおよびデータ: パスワードの管理はユーザーの責任です。 データが暗号化されると、そのデータを暗号化解除するために使用できるのは、暗号化するときに使用したパスワードだけです (SQLSTATE 428FD)。

    暗号化された結果には、NULL 終止符およびその他の印刷不能文字が組み込まれることがあります。 推奨されているデータ長よりも短い長さへの割り当てまたは cast は、 暗号化解除の失敗やデータ脱落の原因となります。 ブランクは、短すぎる列に保管するときに切り捨てられる有効な暗号化データ値です。

  • 暗号化データの管理: 暗号化データは、 ENCRYPT 関数に対応する暗号化解除関数をサポートしているサーバーでのみ暗号化解除できます。 そのため、暗号化データの入った列の複製は、 DECRYPT_BIN または DECRYPT_CHAR 関数をサポートしているサーバーで行わなければなりません。
  • 述部での暗号化データの回避: ENCRYPT 関数は、同じ入力が与えられても、常に同じ暗号化データを生成するとは限りません。 検索条件や比較演算で暗号化データを使用しないでください。 例えば、述部で暗号化データを使用しないでください。

  • 例 1: 以下の例では、組み込み SQL アプリケーション内のコード部分を示して、ENCRYPT 関数の使用法を示します。
    EXEC SQL BEGIN DECLARE SECTION;
          char hostVarCreateTableStmt[100];
          char hostVarSetEncPassStmt[200]; 
          char hostVarPassword[128];
          char hostVarInsertStmt1[200];
          char hostVarInsertStmt2[200];
          char hostVarInsertStmt3[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; 
  • 例 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; 
  • 例 4: 以下のように、パスワードのヒントを定義します。
    /* prepare the statement */ 
    strcpy(hostVarInsertStmt3, "INSERT INTO EMP(SSN) VALUES ENCRYPT('289-46-8832',?,'Ocean')"); 
    EXEC SQL PREPARE hostVarInsertStmt3 FROM :hostVarInsertStmt3;
    
    /* execute the statement for hostVarPassword = 'Pac1f1c' */ 
    strcpy(hostVarPassword, "Pac1f1c"); 
    EXEC SQL EXECUTE hostVarInsertStmt3 USING :hostVarPassword;