セッションIDを生成する準備

mod_plsqlを利用したWebアプリケーションではセッション管理について支援が無い。Cookieとデータベースを使用してセッション管理機能を自作しなければならない。(セッション管理機能はいろいろセキュリティ上の問題を作り込むポイントらしいので、PL/SQLでWebアプリを作るという超ローカルな環境での使用のみを前提にしている。)

準備

乱数や暗号化を扱うパッケージは「DBMS_CRYPTO」で、SYS以外は通常使用できないようになっている。
SYSユーザで実行許可を与える。

--SYSユーザで実施
GRANT EXECUTE ON DBMS_CRYPTO TO MANAGEMENTUSER;

使用するパッケージ

  • DBMS_CRYPTO : 乱数生成とハッシュ計算に使用する。
  • UTIL_I18N : RAW型とVARCHAR2型の変換に使用する。
  • UTIL_ENCODE : base64エンコーディングに使用する。

セッションIDの生成ロジック

DECLARE
    rand1 RAW(18);
    rand2 RAW(18);
    hmac  RAW(20);
    lpart_b64 VARCHAR2(24);
    rpart_b64 VARCHAR2(28);
BEGIN
    --左のパートは乱数の base64 表現。
    rand1 := DBMS_CRYPTO.RANDOMBYTES(18);
    --UTL_RAWではなくUTL_I18Nを使用する。
    lpart_b64 := UTL_I18N.RAW_TO_CHAR(UTL_ENCODE.BASE64_ENCODE(rand1),'US7ASCII');

    --HMAC計算。
    rand2 := DBMS_CRYPTO.RANDOMBYTES(18);
    hmac := DBMS_CRYPTO.MAC(rand1,DBMS_CRYPTO.HMAC_SH1,rand2);
    rpart_b64 := UTL_I18N.RAW_TO_CHAR(UTL_ENCODE.BASE64_ENCODE(hmac),'US7ASCII');

    --クッキーには lpart_b64.rpart_b64 を設定する。長さは 53 (24 + 1 + 28) になる。
    DBMS_OUTPUT.PUT_LINE(lpart_b64||'.'||rpart_b64);
END;
/