Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle SQL इन्सर्ट ट्रिगर टू हैश पासवर्ड काम नहीं कर रहा है (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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सोलारिस 10 . पर बेहतर मेमोरी (हीप) प्रबंधन

  2. Oracle.DataAccess.dll मौजूद नहीं है, हालांकि यह मौजूद है

  3. DBLINK पर DBLINK पर सेलेक्ट कैसे करें?

  4. मैं Oracle पर जॉइन के साथ FOR UPDATE का उपयोग कैसे कर सकता हूं?

  5. oracle में कर्सर क्या है?