Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle SQL Insert Trigger to Hash Password nie działa (problem z CHAR)

[TL;DR] Użyj STANDARD_HASH( RTRIM( :new.PASSWORD ), 'SHA256' ) jak chcesz wygenerować hasło na 'BruteForce' a nie 'BruteForce ' (itd.) uzupełnione białymi znakami do długości 64 znaków (co jest tym, co przy użyciu CHAR(64) dałbym ci).

Jeśli nie chcesz używać soli (której powinieneś używać w dzisiejszych czasach), po prostu przytnij hasło prawym przyciskiem myszy, aby pozbyć się końcowego odstępu, który CHAR typ danych uzupełnił ciąg za pomocą:

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;
/

Następnie:

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');

Wygeneruje:

SELECT id, password FROM client;

Hashing i solenie

Na podstawie tej odpowiedzi

Jeśli chcesz również postępować zgodnie z najlepszymi praktykami, powinieneś zmienić hasło przed haszowaniem:

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
);

Wtedy twój wyzwalacz to:

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;
/

A potem:

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

Majowe wyjście:

SELECT * FROM client;

db<>fiddle tutaj



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle — wyzwalacze do tworzenia wiersza historii podczas aktualizacji

  2. Parametr limitu czasu IDLE w Oracle

  3. Wyeliminuj duplikaty za pomocą funkcji Oracle LITAGG

  4. Czy mogę używać wielowątkowości z Perl's DBI i Oracle?

  5. tworzenie ramki danych pandas z zapytania do bazy danych, które używa zmiennych bind