[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