sql >> Database >  >> RDS >> Oracle

Oracle SQL Insert Trigger to Hash Password werkt niet (probleem met CHAR)

[TL;DR] Gebruik STANDARD_HASH( RTRIM( :new.PASSWORD ), 'SHA256' ) zoals u het wachtwoord wilt genereren op 'BruteForce' en niet 'BruteForce ' (etc.) opgevuld met witruimte tot een lengte van 64 tekens (wat is wat met CHAR(64) zou geven).

Als je geen salt wilt gebruiken (die je tegenwoordig zou moeten gebruiken), trim dan gewoon het wachtwoord naar rechts om de volgende witruimte te verwijderen die de CHAR datatype hebben de string opgevuld met:

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

Dan:

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

Zal uitvoeren:

SELECT id, password FROM client;

Hashen en zouten

Aangepast van dit antwoord

Als je ook best practices wilt volgen, moet je het wachtwoord salten voordat je het hashen:

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

Dan is je trigger:

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

En dan:

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

Kan output:

SELECT * FROM client;

db<>fiddle hier



  1. Meest efficiënte aanpak voor meertalige PHP-website

  2. PIVOT dynamisch, geretourneerde resultaten van JOIN van twee tabellen

  3. Waarom de \G in SELECT * FROM tabelnaam\G?

  4. PostgreSQL - items ophalen in de volgorde waarin ze zijn opgeslagen