Oracle SQL 使用单元值密码进行加密
Oracle SQL Encryption Using a Cell Value Password
我是 Oracle 新手 SQL,
并有以下要求,
有一位客户 table 具有以下列,
customer (customer_id, customer_name, contact_number, credit_card_number, income, password)
信用卡号和收入将通过密码栏中给定的密码进行加密。
有什么办法吗?
我进行了广泛的互联网搜索,但找不到答案。
提前致谢。
编辑 2:
我的 encrypt_decrypt 密码列加密包
CREATE OR REPLACE PACKAGE field_encrypt_decrypt
AS
FUNCTION encrypt (p_plainText VARCHAR2) RETURN RAW DETERMINISTIC;
FUNCTION decrypt (p_encryptedText RAW) RETURN VARCHAR2 DETERMINISTIC;
END;
CREATE OR REPLACE PACKAGE BODY encrypt_decrypt
AS
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_ECB
+ DBMS_CRYPTO.PAD_PKCS5;
encryption_key RAW (32) := UTL_RAW.cast_to_raw('01234567890123450123456789012345');
-- The encryption key for DES algorithm, should be 8 bytes or more.
/* Input plaintext to encrypt with the given key in the package */
FUNCTION encrypt (p_plainText VARCHAR2) RETURN RAW DETERMINISTIC
IS
encrypted_raw RAW (2000);
/* The encryption or decryption on VARCHAR2 doesn't work directly using DBMS_CRYPTO, therefore, convert input to RAW before encrypting it */
BEGIN
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_RAW.CAST_TO_RAW (p_plainText),
typ => encryption_type,
key => encryption_key
);
RETURN encrypted_raw;
END encrypt;
FUNCTION decrypt (p_encryptedText RAW) RETURN VARCHAR2 DETERMINISTIC
IS
decrypted_raw RAW (2000);
BEGIN
decrypted_raw := DBMS_CRYPTO.DECRYPT
(
src => p_encryptedText,
typ => encryption_type,
key => encryption_key
);
RETURN (UTL_RAW.CAST_TO_VARCHAR2 (decrypted_raw));
END decrypt;
END;
设法完成任务,
创建包 therdata_encrypt_decrypt
CREATE OR REPLACE PACKAGE otherdata_encrypt_decrypt
AS
FUNCTION encrypt (p_plainText VARCHAR2,p_password VARCHAR2) RETURN RAW DETERMINISTIC;
FUNCTION decrypt (p_encryptedText RAW,p_password VARCHAR2) RETURN VARCHAR2 DETERMINISTIC;
END;
/
CREATE OR REPLACE PACKAGE BODY otherdata_encrypt_decrypt
AS
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_ECB
+ DBMS_CRYPTO.PAD_PKCS5;
/* Input plaintext to encrypt with the given key in the package */
FUNCTION encrypt (p_plainText VARCHAR2, p_password VARCHAR2) RETURN RAW DETERMINISTIC
IS
encrypted_raw RAW (2000);
/* The encryption or decryption on VARCHAR2 doesn't work directly using DBMS_CRYPTO, therefore, convert input to RAW before encrypting it */
BEGIN
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_RAW.CAST_TO_RAW (p_plainText),
typ => encryption_type,
/* Key Length Needs to be 32 for AES 256 Encryption Since Padding with A */
key => UTL_RAW.cast_to_raw(LPAD(p_password,32,'A'))
);
RETURN encrypted_raw;
END encrypt;
FUNCTION decrypt (p_encryptedText RAW,p_password VARCHAR2) RETURN VARCHAR2 DETERMINISTIC
IS
decrypted_raw RAW (2000);
BEGIN
decrypted_raw := DBMS_CRYPTO.DECRYPT
(
src => p_encryptedText,
typ => encryption_type,
/* Key Length Needs to be 32 for AES 256 Encryption Since Padding with A */
key => UTL_RAW.cast_to_raw (LPAD(p_password,32,'A'))
);
RETURN (UTL_RAW.CAST_TO_VARCHAR2 (decrypted_raw));
END decrypt;
END;
创建过程
create or replace PROCEDURE CUSTOMERDEPT.insert_encrypt
(p_customer_id in customer.customer_id%TYPE,
p_customer_name in customer.customer_name%TYPE,
p_contact_number in customer.contact_number%TYPE,
p_credit_card_number in customer.credit_card_number%TYPE,
p_income in customer.income%TYPE,
p_password in customer.password%TYPE)
IS
encrypt_credit_card_no RAW(200);
encrypt_income RAW(200);
p_password_encrypt RAW(200);
BEGIN
encrypt_credit_card_no:=SYS.OTHERDATA_ENCRYPT_DECRYPT.ENCRYPT(p_credit_card_number,p_password);
encrypt_income:=SYS.OTHERDATA_ENCRYPT_DECRYPT.ENCRYPT(p_income,p_password);
p_password_encrypt:=SYS.ENCRYPT_DECRYPT.ENCRYPT(p_password);
INSERT INTO customer(customer_id, customer_name, contact_number, credit_card_number, income, password)
VALUES (p_customer_id,p_customer_name,p_contact_number,encrypt_credit_card_no,encrypt_income,p_password_encrypt);
COMMIT;
END;
测试:
EXEC insert_encrypt (7, Test123, 0777712345, '11112223334455', '2222.22', '122122')
我是 Oracle 新手 SQL,
并有以下要求,
有一位客户 table 具有以下列,
customer (customer_id, customer_name, contact_number, credit_card_number, income, password)
信用卡号和收入将通过密码栏中给定的密码进行加密。
有什么办法吗? 我进行了广泛的互联网搜索,但找不到答案。
提前致谢。
编辑 2: 我的 encrypt_decrypt 密码列加密包
CREATE OR REPLACE PACKAGE field_encrypt_decrypt
AS
FUNCTION encrypt (p_plainText VARCHAR2) RETURN RAW DETERMINISTIC;
FUNCTION decrypt (p_encryptedText RAW) RETURN VARCHAR2 DETERMINISTIC;
END;
CREATE OR REPLACE PACKAGE BODY encrypt_decrypt
AS
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_ECB
+ DBMS_CRYPTO.PAD_PKCS5;
encryption_key RAW (32) := UTL_RAW.cast_to_raw('01234567890123450123456789012345');
-- The encryption key for DES algorithm, should be 8 bytes or more.
/* Input plaintext to encrypt with the given key in the package */
FUNCTION encrypt (p_plainText VARCHAR2) RETURN RAW DETERMINISTIC
IS
encrypted_raw RAW (2000);
/* The encryption or decryption on VARCHAR2 doesn't work directly using DBMS_CRYPTO, therefore, convert input to RAW before encrypting it */
BEGIN
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_RAW.CAST_TO_RAW (p_plainText),
typ => encryption_type,
key => encryption_key
);
RETURN encrypted_raw;
END encrypt;
FUNCTION decrypt (p_encryptedText RAW) RETURN VARCHAR2 DETERMINISTIC
IS
decrypted_raw RAW (2000);
BEGIN
decrypted_raw := DBMS_CRYPTO.DECRYPT
(
src => p_encryptedText,
typ => encryption_type,
key => encryption_key
);
RETURN (UTL_RAW.CAST_TO_VARCHAR2 (decrypted_raw));
END decrypt;
END;
设法完成任务, 创建包 therdata_encrypt_decrypt
CREATE OR REPLACE PACKAGE otherdata_encrypt_decrypt
AS
FUNCTION encrypt (p_plainText VARCHAR2,p_password VARCHAR2) RETURN RAW DETERMINISTIC;
FUNCTION decrypt (p_encryptedText RAW,p_password VARCHAR2) RETURN VARCHAR2 DETERMINISTIC;
END;
/
CREATE OR REPLACE PACKAGE BODY otherdata_encrypt_decrypt
AS
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_ECB
+ DBMS_CRYPTO.PAD_PKCS5;
/* Input plaintext to encrypt with the given key in the package */
FUNCTION encrypt (p_plainText VARCHAR2, p_password VARCHAR2) RETURN RAW DETERMINISTIC
IS
encrypted_raw RAW (2000);
/* The encryption or decryption on VARCHAR2 doesn't work directly using DBMS_CRYPTO, therefore, convert input to RAW before encrypting it */
BEGIN
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_RAW.CAST_TO_RAW (p_plainText),
typ => encryption_type,
/* Key Length Needs to be 32 for AES 256 Encryption Since Padding with A */
key => UTL_RAW.cast_to_raw(LPAD(p_password,32,'A'))
);
RETURN encrypted_raw;
END encrypt;
FUNCTION decrypt (p_encryptedText RAW,p_password VARCHAR2) RETURN VARCHAR2 DETERMINISTIC
IS
decrypted_raw RAW (2000);
BEGIN
decrypted_raw := DBMS_CRYPTO.DECRYPT
(
src => p_encryptedText,
typ => encryption_type,
/* Key Length Needs to be 32 for AES 256 Encryption Since Padding with A */
key => UTL_RAW.cast_to_raw (LPAD(p_password,32,'A'))
);
RETURN (UTL_RAW.CAST_TO_VARCHAR2 (decrypted_raw));
END decrypt;
END;
创建过程
create or replace PROCEDURE CUSTOMERDEPT.insert_encrypt
(p_customer_id in customer.customer_id%TYPE,
p_customer_name in customer.customer_name%TYPE,
p_contact_number in customer.contact_number%TYPE,
p_credit_card_number in customer.credit_card_number%TYPE,
p_income in customer.income%TYPE,
p_password in customer.password%TYPE)
IS
encrypt_credit_card_no RAW(200);
encrypt_income RAW(200);
p_password_encrypt RAW(200);
BEGIN
encrypt_credit_card_no:=SYS.OTHERDATA_ENCRYPT_DECRYPT.ENCRYPT(p_credit_card_number,p_password);
encrypt_income:=SYS.OTHERDATA_ENCRYPT_DECRYPT.ENCRYPT(p_income,p_password);
p_password_encrypt:=SYS.ENCRYPT_DECRYPT.ENCRYPT(p_password);
INSERT INTO customer(customer_id, customer_name, contact_number, credit_card_number, income, password)
VALUES (p_customer_id,p_customer_name,p_contact_number,encrypt_credit_card_no,encrypt_income,p_password_encrypt);
COMMIT;
END;
测试:
EXEC insert_encrypt (7, Test123, 0777712345, '11112223334455', '2222.22', '122122')