Hologres V4.0 et versions ultérieures prennent en charge un sous-ensemble des fonctions de l'extension PostgreSQL pgcrypto pour chiffrer, déchiffrer et encoder les données, afin de protéger les informations sensibles. Cette rubrique décrit les fonctions prises en charge, leur syntaxe, leurs paramètres, des exemples et les notes d'utilisation.
Présentation
L'extension pgcrypto fournit des fonctions de chiffrement, de déchiffrement et d'encodage pour protéger les données sensibles. Avant d'utiliser ces fonctions, créez l'extension en exécutant la commande suivante : CREATE EXTENSION IF NOT EXISTS pgcrypto;
Limites
Les fonctions pgcrypto décrites dans cette rubrique sont prises en charge uniquement sur Hologres V4.0 et versions ultérieures.
-
Les fonctions pgcrypto s'exécutent uniquement dans le moteur PQE. Ne les utilisez pas dans la même instruction SQL que des fonctions s'exécutant exclusivement dans le moteur HQE, telles que les UDF distantes. Le mélange de ces fonctions provoque un conflit de moteur d'exécution et renvoie l'erreur suivante :
ERROR: ORCA failed to produce a plan : No plan has been computed for required propertiesPour utiliser conjointement les fonctions pgcrypto et les UDF distantes, séparez les opérations en plusieurs instructions SQL distinctes.
Fonctions prises en charge
Hologres prend en charge les fonctions pgcrypto suivantes :
|
Fonction |
Description |
|
Encode des données binaires en une représentation textuelle selon un format spécifié. |
|
|
Décode une chaîne depuis un format spécifié vers des données binaires. |
|
|
Chiffre des données à l'aide d'un algorithme et d'une clé spécifiés. |
|
|
Déchiffre des données à l'aide d'un algorithme et d'une clé spécifiés. |
|
|
Convertit des données binaires depuis un encodage de caractères spécifié vers la représentation interne de la base de données (par exemple UTF-8). |
Détails des fonctions
encode(data, format)
Description : Encode des données binaires (type
bytea) en une chaîne de texte selon le format spécifié.-
Syntaxe
encode(data bytea, format text) -
Paramètres
data: Données binaires à encoder.format: Format d'encodage. Valeurs possibles :hex,base64ouescape.
Valeur de retour : Chaîne de texte encodée.
-
Exemple
-- Encode binary data as hex SELECT encode('\xDEADBEEF'::bytea, 'hex'); -- Result: deadbeef -- Encode binary data as Base64 SELECT encode('\x12345678'::bytea, 'base64'); -- Result: EjRWeA==
decode(str, format)
Description : Décode une chaîne de texte depuis un format spécifié vers des données binaires (
bytea).-
Syntaxe
decode(str text, format text) -
Paramètres
str: Chaîne à décoder.format: Format de décodage. Formats pris en charge :hex,base64etescape.
Valeur de retour : Données binaires décodées (
bytea).-
Exemple
-- Decode a hex string into binary data SELECT decode('deadbeef', 'hex'); -- Result: \xdeadbeef -- Decode a Base64 string into binary data SELECT decode('EjRWeA==', 'base64'); -- Result: \x12345678
encrypt(data, key, algorithm)
Description : Chiffre des données à l'aide d'une clé et d'un algorithme spécifiés.
-
Syntaxe
encrypt(data bytea, key bytea, algorithm text) -
Paramètres
data: Données brutes à chiffrer.key: Clé de chiffrement.algorithm: Algorithme de chiffrement, par exempleaesouaes-ecb/pad:pkcs.
Valeur de retour : Données binaires chiffrées (
bytea).-
Exemple
-- Encrypt data using the AES algorithm and output the result as a Base64 string SELECT encode(encrypt('hello world'::bytea, 'mysecretpassword'::bytea, 'aes-ecb/pad:pkcs'), 'base64'); -- Result: The encrypted Base64 string. The output varies with each execution due to cryptographic randomness.
decrypt(data, key, algorithm)
Description : Déchiffre des données avec une clé et un algorithme spécifiés. La clé et l'algorithme doivent correspondre à ceux utilisés lors du chiffrement.
-
Syntaxe
decrypt(data bytea, key bytea, algorithm text) -
Paramètres
data: Données à déchiffrer.key: Clé de déchiffrement (identique à celle utilisée pour le chiffrement).algorithm: Algorithme de déchiffrement (identique à celui utilisé pour le chiffrement).
Valeur de retour : Données binaires déchiffrées (bytea), souvent utilisées avec
convert_frompour obtenir le texte en clair.-
Exemple
-- Decrypt the Base64 ciphertext and convert it to UTF-8 text. -- Replace <encrypted_base64_string> with the actual ciphertext. SELECT convert_from( decrypt( decode('<encrypted_base64_string>', 'base64'), 'mysecretpassword'::bytea, 'aes-ecb/pad:pkcs' ), 'utf8' ); -- Result: The decrypted plaintext
convert_from(data, encoding)
Description : Convertit des données binaires depuis un encodage de caractères spécifié vers la représentation interne de la base de données (par exemple UTF-8).
-
Syntaxe
convert_from(data bytea, encoding name) -
Paramètres
data: Données binaires avec un encodage spécifique.encoding: Encodage de caractères des données source, par exempleutf8,latin1ougbk.
Valeur de retour : Chaîne de texte convertie.
-
Exemple
-- Convert GBK-encoded binary data to text SELECT convert_from('\xb0\xc5\xba\xcd'::bytea, 'gbk'); -- Result: Chinese characters
Exemple pratique
Cet exemple montre comment utiliser les fonctions pgcrypto pour chiffrer des champs sensibles (tels que les numéros de carte d'identité) avant stockage, puis les déchiffrer lors des requêtes.
-- Enable the pgcrypto extension.
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- Create a user information table that contains sensitive data.
CREATE TABLE mf_user_info (
id bigint,
name text,
gender text,
id_card_no text,
tel text
);
INSERT INTO mf_user_info VALUES
(1, 'bob', 'male', '0001', '13900001234'),
(2, 'allen', 'male', '0011', '13900001111'),
(3, 'kate', 'female', '0111', '13900002222'),
(4, 'annie', 'female', '1111', '13900003333');
-- Create a table for encrypted storage.
CREATE TABLE mf_user_info_encrypt (
id bigint,
name text,
gender text,
id_card_no_encrypt text,
tel text
);
-- Encrypt the sensitive data and write it to the new table.
INSERT INTO mf_user_info_encrypt
SELECT
id, name, gender,
encode(encrypt(id_card_no::text::bytea, 'myencryptionkey'::bytea, 'aes-ecb/pad:pkcs'), 'base64') AS id_card_no_encrypt,
tel
FROM mf_user_info;
-- Decrypt and query the ID card numbers.
SELECT id, name, gender,
convert_from(decrypt(decode(id_card_no_encrypt, 'base64'), 'myencryptionkey'::bytea, 'aes-ecb/pad:pkcs'), 'utf8') AS id_card_no,
tel
FROM mf_user_info_encrypt;
Notes d'utilisation
Sécurité : Choisissez un algorithme de chiffrement et une longueur de clé conformes à vos exigences de sécurité.
Performance : Le chiffrement et le déchiffrement consomment des ressources de calcul supplémentaires. Évaluez le compromis entre performance et sécurité.
Gestion des clés : Gérez vos clés de chiffrement de manière sécurisée. Évitez d'intégrer les clés directement dans le code de votre application.
Encodage : Lorsque vous traitez des caractères multi-octets, assurez-vous de la cohérence de l'encodage des caractères. Par exemple, convertissez les données en
byteaavant le chiffrement et spécifiez l'encodage correct avecconvert_fromaprès le déchiffrement.
Références
Pour plus d'informations sur pgcrypto, consultez la documentation officielle de PostgreSQL pgcrypto.
Compatibilité
L'implémentation de pgcrypto dans Hologres est compatible avec PostgreSQL. Toutefois, Hologres ne prend en charge que les fonctions répertoriées dans cette rubrique, et non l'ensemble complet des fonctions de l'extension pgcrypto de PostgreSQL.