Utilisation de lua-resty-string pour les fonctions de hachage et chiffrement dans OpenResty

Installation du module

Pour intégrer lua-resty-string dans votre environnement OpenResty, exécutez la commende suivanet :

sudo opm get openresty/lua-resty-string

Cette opération ajoute plusieurs fichiers Lua essentiels dans le répertoire des modules, incluant les implémentations pour AES, MD5, SHA, la génération aléatoire et les utilitaires de chaînes.

Exemples de code pour les opérations cryptographiques

Les exemples ci-dessous démontrent l'utilisation des fonctions de hachage et de chiffrement disponibles dans lua-resty-string.

Hachage avec SHA1

local sha1_module = require "resty.sha1"
local hex_converter = require "resty.string"

local hash_instance = sha1_module:new()
if not hash_instance then
    ngx.say("Erreur lors de la création de l'instance SHA1")
    return
end

local update_status = hash_instance:update("Contenu partiel")
if not update_status then
    ngx.say("Échec de l'ajout des données")
    return
end

update_status = hash_instance:update(" suite du message")
if not update_status then
    ngx.say("Échec de l'ajout des données")
    return
end

local sha1_digest = hash_instance:final()
ngx.say("Résultat SHA1: ", hex_converter.to_hex(sha1_digest))

Hachage avec MD5

local md5_lib = require "resty.md5"
local str_utils = require "resty.string"

local md5_context = md5_lib:new()
if not md5_context then
    ngx.say("Impossible d'initialiser l'objet MD5")
    return
end

md5_context:update("Segment de données 1")
md5_context:update("Segment de données 2")
local md5_hash = md5_context:final()
ngx.say("Empreinte MD5: ", str_utils.to_hex(md5_hash))

Hachage SHA224, SHA256, SHA384 et SHA512

local sha_variants = {
    { module = "resty.sha224", label = "SHA224" },
    { module = "resty.sha256", label = "SHA256" },
    { module = "resty.sha384", label = "SHA384" },
    { module = "resty.sha512", label = "SHA512" }
}

for _, variant in ipairs(sha_variants) do
    local sha_lib = require(variant.module)
    local hex_util = require "resty.string"
    local sha_obj = sha_lib:new()
    if sha_obj then
        sha_obj:update("Données de test pour hachage")
        local digest = sha_obj:final()
        ngx.say(variant.label .. ": ", hex_util.to_hex(digest))
    else
        ngx.say("Échec pour " .. variant.label)
    end
end

Génération de nombres aléatoires

local random_gen = require "resty.random"
local string_helper = require "resty.string"

local pseudo_bytes = random_gen.bytes(16)  -- Octets pseudo-aléatoires
ngx.say("Données pseudo-aléatoires: ", string_helper.to_hex(pseudo_bytes))

local secure_bytes
repeat
    secure_bytes = random_gen.bytes(16, true)  -- Aléatoire cryptographiquement fort
until secure_bytes
ngx.say("Données aléatoires sécurisées: ", string_helper.to_hex(secure_bytes))

Chiffrement et déchiffrement avec AES

Configuration AES 128 CBC avec dérivation de clé MD5 :

local aes_module = require "resty.aes"
local format_util = require "resty.string"

local cipher_key = "CléSecrète12345"
local aes_instance = aes_module:new(cipher_key)
if not aes_instance then
    ngx.say("Erreur d'initialisation AES")
    return
end

local encrypted_data = aes_instance:encrypt("Message confidentiel")
ngx.say("Chiffré HEX: ", format_util.to_hex(encrypted_data))
local decrypted_data = aes_instance:decrypt(encrypted_data)
ngx.say("Déchiffré: ", decrypted_data)

Configuration AES 256 CBC avec sel et dérivation SHA-512 :

local aes_lib = require "resty.aes"
local hex_tool = require "resty.string"

local salt_value = "MonSel!8"
local aes_256_config = aes_lib:new("CléLonguePourAES256", salt_value, aes_lib.cipher(256, "cbc"), aes_lib.hash.sha512, 3)
if aes_256_config then
    local ciphertext = aes_256_config:encrypt("Texte ultra-secret")
    ngx.say("AES-256 chiffré: ", hex_tool.to_hex(ciphertext))
    local plaintext = aes_256_config:decrypt(ciphertext)
    ngx.say("AES-256 déchiffré: ", plaintext)
else
    ngx.say("Impossible de configurer AES-256")
end

Configuration AES 128 CBC avec vecteur d'initialisation explicite :

local aes_provider = require "resty.aes"
local conv_utils = require "resty.string"

local iv_value = "1234567890123456"
local aes_iv_instance = aes_provider:new("CléPourAvecVI", nil, aes_provider.cipher(128, "cbc"), {iv = iv_value})
assert(aes_iv_instance, "Échec de création de l'instance AES avec IV")

local enc_result = aes_iv_instance:encrypt("Données protégées par IV")
ngx.say("AES avec IV chiffré: ", conv_utils.to_hex(enc_result))
local dec_result = aes_iv_instance:decrypt(enc_result)
ngx.say("AES avec IV déchiffré: ", dec_result)

Résultats attendus

L'exécution des exemples précédents produit des sorties similaires aux suiventes, variant selon les données d'entrée :

Résultat SHA1: [empreinte hexadécimale SHA1]
Empreinte MD5: [empreinte hexadécimale MD5]
SHA224: [hash SHA224]
SHA256: [hash SHA256]
SHA384: [hash SHA384]
SHA512: [hash SHA512]
Données pseudo-aléatoires: [suite hexadécimale]
Données aléatoires sécurisées: [suite hexadécimale]
Chiffré HEX: [données chiffrées en hex]
Déchiffré: Message confidentiel
AES-256 chiffré: [données chiffrées AES-256]
AES-256 déchiffré: Texte ultra-secret
AES avec IV chiffré: [données chiffrées avec IV]
AES avec IV déchiffré: Données protégées par IV

Étiquettes: openresty lua-resty-string MD5 sha1 sha224

Publié le 12 juin à 01h46