[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 यहां