web-dev-qa-db-ja.com

Oracle 11gでのSHA-256ハッシュ

トリガーを使用して別のテーブルにハッシュ値を格納できるように、sha-256を使用してトリガー内のパスワードを暗号化またはハッシュするにはどうすればよいですか?また、どうすれば解読できますか?

残念ながらDBMS_CRYPTO Oracle 11.2では、160ビットのSHA1( ドキュメントリンク )のみをサポートしています。 。

DBMS_CRYPTO Oracle 12.1ではSHA2をサポートしていますHASH_SH256ドキュメントリンク )、必要なことを行います。

SHA2のいくつかの無料の実装は、グーグルですぐに使えます。 このブログ投稿 など。

ハッシュ化されたパスワードの復号化については?あなたはハッシュを理解していないと思います。ハッシュは、ブルートフォースまたは Rainbow Tables を使用しない限り、一方向です。パスワードが正しいかどうかを確認するには、ハッシュして、保存されているハッシュと比較します。

12
Philᵀᴹ

Sha256パックを使用した私の実装

  Function hmac_sha256
  (
    ptext Varchar2,
    pkey  Varchar2
  ) Return Varchar2
 Is
    -- pad const
    c_opad      Raw(1) := '5c';
    c_ipad      Raw(1) := '36';
    c_kpad      Raw(1) := '00';

    --SHA256 block size 512 bit
    c_blocksize Integer := 64;

    --local var, length equals to blocksize
    l_opad        Raw(64);
    l_ipad        Raw(64);
    l_key         Raw(64);
  Begin

    l_opad := utl_raw.copies(c_opad, c_blocksize);
    l_ipad := utl_raw.copies(c_ipad, c_blocksize);

    If utl_raw.length(utl_raw.cast_to_raw(pkey)) > c_blocksize Then
      l_key := utl_raw.cast_to_raw(sha256.encrypt(pkey));
    Else
      l_key := utl_raw.cast_to_raw(pkey);
    End If;

    l_key := l_key ||
             utl_raw.copies(c_kpad, c_blocksize - utl_raw.length(l_key));

    Return sha256.encrypt_raw(utl_raw.bit_xor(l_key, l_opad) ||
                              sha256.encrypt_raw(utl_raw.bit_xor(l_key, l_ipad) || utl_raw.cast_to_raw(ptext))
                              );

  End;
3
Anakoliy