sql >> データベース >  >> RDS >> Oracle

Oracle SQL Insert Trigger to Hash Passwordが機能しない(CHARで発行)

    [TL; DR] STANDARD_HASH( RTRIM( :new.PASSWORD ), 'SHA256' )を使用します 'BruteForce 'でパスワードを生成したいので 'BruteForce 'ではありません (など)64文字の長さまで空白で埋められます(これはCHAR(64)を使用するものです 与えるだろう)。

    ソルト(この時代に使用する必要があります)を使用したくない場合は、パスワードを適切にトリミングして、CHARの末尾の空白を削除します。 データ型は文字列を次のように埋め込んでいます:

    CREATE OR REPLACE TRIGGER client_hash_trigger
    BEFORE INSERT ON client
    FOR EACH ROW
    BEGIN
      SELECT STANDARD_HASH( RTRIM( :new.PASSWORD ), 'SHA256' )
      INTO   :new.PASSWORD
      FROM   DUAL;
    END;
    /
    

    次に:

    CREATE TABLE client (
        id            NUMBER(10,0)
                      GENERATED ALWAYS AS IDENTITY
                      CONSTRAINT client__id__pk PRIMARY KEY,
        password      CHAR(64)
                      NOT NULL
    );
    
    INSERT INTO client (id, password) VALUES (DEFAULT, 'BruteForce');
    

    出力されます:

    SELECT id, password FROM client;
    

    ハッシュとソルト

    この回答 から引用

    ベストプラクティスにも従う場合は、ハッシュする前にパスワードをソルトする必要があります:

    CREATE TABLE client (
        id            NUMBER(10,0)
                      GENERATED ALWAYS AS IDENTITY
                      CONSTRAINT client__id__pk PRIMARY KEY,
        password      CHAR(64)
                      NOT NULL,
        password_salt VARCHAR2(61)
                      NOT NULL
    );
    

    次に、トリガーは次のとおりです。

    CREATE TRIGGER client_hash_trigger
    BEFORE INSERT OR UPDATE ON client
    FOR EACH ROW
    BEGIN
      IF :new.PASSWORD = :old.PASSWORD THEN
        -- Assume things haven't changed (The chances of a hash collision are vanishingly small).
        -- Make sure the old salt is not replaced if the password hash hasn't changed.
        :new.PASSWORD_SALT := :old.PASSWORD_SALT;
      ELSE
        -- Regenerate a new salt and hash the password.
        :new.PASSWORD_SALT := DBMS_RANDOM.STRING( 'P', FLOOR( DBMS_RANDOM.VALUE( 40, 61 ) ) );
        SELECT STANDARD_HASH ( :new.PASSWORD_SALT || RTRIM( :new.PASSWORD ), 'SHA256' )
        INTO   :new.PASSWORD
        FROM   DUAL;
      END IF;
    END;
    /
    

    そして:

    INSERT INTO client (id, password) VALUES (DEFAULT, 'BruteForce');
    

    出力される可能性があります:

    SELECT * FROM client;
    

    db <> fiddle こちら



    1. Oracle10gフォームがWindows7Professionalのフォーム開発者で開かない

    2. PostgreSQLレプリケーション101のフェイルオーバー

    3. 注文で1日あたり10行を選択

    4. MySQLINSERT...一括挿入用のdjango1.4を使用した重複キーの更新