Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle SQL Insert Trigger to Hash Password không hoạt động (Sự cố với CHAR)

[TL; DR] Sử dụng STANDARD_HASH( RTRIM( :new.PASSWORD ), 'SHA256' ) khi bạn muốn tạo mật khẩu trên 'BruteForce' chứ không phải 'BruteForce' (v.v.) được đệm bằng khoảng trắng có độ dài 64 ký tự (đó là những gì sử dụng CHAR(64) sẽ cung cấp cho bạn).

Nếu bạn không muốn sử dụng một Salt (mà bạn nên sử dụng trong thời đại ngày nay) thì chỉ cần cắt bỏ mật khẩu để loại bỏ khoảng trắng ở cuối mà CHAR kiểu dữ liệu đã đệm chuỗi bằng:

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

Sau đó:

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

Sẽ xuất:

SELECT id, password FROM client;

Băm và ướp muối

Phỏng theo câu trả lời này

Nếu bạn cũng muốn làm theo phương pháp hay nhất, thì bạn nên nhập mật khẩu trước khi băm:

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

Sau đó, trình kích hoạt của bạn là:

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

Và sau đó:

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

Có thể xuất:

SELECT * FROM client;

db <> fiddle tại đây



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. lợi thế của việc sử dụng một trình kích hoạt để điền khóa thay thế trong oracle plsql

  2. Cách đặt thời gian chờ kết nối oracle db trong ứng dụng Spring Boot

  3. Chỉ loại trừ một giá trị MIN trên Oracle SQL

  4. Làm thế nào để sử dụng bảng tạm thời toàn cầu Oracle?

  5. Cách sử dụng phép nối trên ba bảng