[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