openssl
# *openssl*: Enlace OpenSSL basado en FFI para nginx-module-lua
## Instalación
Si no has configurado la suscripción al repositorio RPM, [regístrate](https://www.getpagespeed.com/repo-subscribe). Luego puedes proceder con los siguientes pasos.
### CentOS/RHEL 7 o Amazon Linux 2
```bash
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-openssl
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-openssl
Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-openssl v1.8.0 lanzado el 10 de junio de 2026.
Enlace OpenSSL basado en FFI para LuaJIT, que soporta OpenSSL 3, 4 y la serie 1.1.1.
El soporte para OpenSSL 1.1.0, 1.0.2 y BoringSSL ha sido eliminado, pero aún están disponibles en la rama 0.x.
Descripción
lua-resty-openssl es una biblioteca de enlace OpenSSL basada en FFI, que actualmente soporta OpenSSL 3.x, 4.x y la serie 1.1.1.
Sinopsis
Esta biblioteca está inspirada en gran medida por luaossl y utiliza una convención de nombres más cercana a la API original de OpenSSL. Por ejemplo, una función llamada X509_set_pubkey en la API C de OpenSSL se expone como resty.openssl.x509:set_pubkey.
CamelCase se reemplaza por underscore_case, por ejemplo, X509_set_serialNumber se convierte en resty.openssl.x509:set_serial_number. Otra diferencia con luaossl es que los errores nunca se lanzan usando error(), sino que se devuelven como último parámetro.
Cada tabla Lua devuelta por new() contiene un objeto cdata ctx. No se supone que los usuarios deban establecer manualmente ffi.gc o llamar al destructor correspondiente de la estructura ctx (como las funciones *_free).
resty.openssl
Este módulo meta proporciona una verificación de versión contra la biblioteca OpenSSL vinculada.
openssl.load_library
sintaxis: name, err = openssl.load_library()
Intenta cargar las bibliotecas compartidas de OpenSSL. Esta función intenta un par de patrones de nombres de bibliotecas conocidos y devuelve el nombre de la biblioteca crypto cuando se carga con éxito, o un error si hay alguno.
Cuando se ejecuta dentro de resty CLI o OpenResty con SSL habilitado, llamar a esta función no es necesario.
openssl.load_modules
sintaxis: openssl.load_modules()
Carga todos los submódulos disponibles en el módulo actual:
bn = require("resty.openssl.bn"),
cipher = require("resty.openssl.cipher"),
digest = require("resty.openssl.digest"),
hmac = require("resty.openssl.hmac"),
kdf = require("resty.openssl.kdf"),
pkey = require("resty.openssl.pkey"),
objects = require("resty.openssl.objects"),
rand = require("resty.openssl.rand"),
version = require("resty.openssl.version"),
x509 = require("resty.openssl.x509"),
altname = require("resty.openssl.x509.altname"),
chain = require("resty.openssl.x509.chain"),
csr = require("resty.openssl.x509.csr"),
crl = require("resty.openssl.x509.crl"),
extension = require("resty.openssl.x509.extension"),
extensions = require("resty.openssl.x509.extensions"),
name = require("resty.openssl.x509.name"),
store = require("resty.openssl.x509.store"),
ssl = require("resty.openssl.ssl"),
ssl_ctx = require("resty.openssl.ssl_ctx"),
A partir de OpenSSL 3.0, provider, mac y ctx también están disponibles.
openssl.luaossl_compat
sintaxis: openssl.luaossl_compat()
Proporciona una API al estilo de luaossl que utiliza nombres en camelCase; los usuarios pueden esperar un reemplazo directo.
Por ejemplo, pkey:get_parameters se mapea a pkey:getParameters.
Ten en cuenta que no se ha implementado toda la API de luaossl, consulta el README para la fuente de verdad.
openssl.get_fips_mode
sintaxis: enabled = openssl.get_fips_mode()
Devuelve un booleano que indica si el modo FIPS está habilitado.
openssl.set_fips_mode
sintaxis: ok, err = openssl.set_fips_mode(enabled)
Activa o desactiva el modo FIPS.
lua-resty-openssl soporta los siguientes modos:
Serie OpenSSL 1.0.2 con módulo fips 2.0
Compila el módulo según la política de seguridad,
Proveedor FIPS de OpenSSL 3
Consulta https://wiki.openssl.org/index.php/OpenSSL_3.0 Sección 7 Compila el proveedor según la guía, instala el fipsmodule.cnf que coincida con el hash del proveedor FIPS fips.so.
A partir de OpenSSL 3.0, esta función también activa y desactiva las propiedades predeterminadas para las funciones EVP. Cuando está activado, todas las aplicaciones que utilizan la API EVP_* se redirigirán a implementaciones compatibles con FIPS y no tendrán acceso a algoritmos no compatibles con FIPS.
Llamar a esta función es equivalente a cargar el proveedor fips y
llamar a openssl.set_default_properties("fips=yes").
Si el proveedor FIPS está cargado pero las propiedades predeterminadas no están establecidas, utiliza lo siguiente para obtener explícitamente la implementación FIPS.
local provider = require "resty.openssl.provider"
assert(provider.load("fips"))
local cipher = require "resty.openssl.cipher"
local c = assert(cipher.new("aes256"))
print(c:get_provider_name()) -- imprime "default"
local c = assert(cipher.new("aes256", "fips=yes"))
print(c:get_provider_name()) -- imprime "fips"
openssl.get_fips_version_text
sintaxis: text, err = openssl.get_fips_version_text()
Devuelve el texto de la versión del módulo FIPS, disponible en OpenSSL 3.0 o posterior.
openssl.set_default_properties
sintaxis: ok, err = openssl.set_default_properties(props)
Establece las propiedades predeterminadas para todas las futuras búsquedas de algoritmos EVP, implícitas así como explícitas. Consulta "ALGORITHM FETCHING" en crypto(7) para información sobre búsquedas implícitas y explícitas.
openssl.list_cipher_algorithms
sintaxis: ret = openssl.list_cipher_algorithms(hide_provider?)
Devuelve los algoritmos de cifrado disponibles en un array. Establece hide_provider a true para
ocultar el nombre del proveedor del resultado.
openssl.list_digest_algorithms
sintaxis: ret = openssl.list_digest_algorithms(hide_provider?)
Devuelve los algoritmos de resumen disponibles en un array. Establece hide_provider a true para
ocultar el nombre del proveedor del resultado.
openssl.list_mac_algorithms
sintaxis: ret = openssl.list_mac_algorithms(hide_provider?)
Devuelve los algoritmos MAC disponibles en un array. Establece hide_provider a true para
ocultar el nombre del proveedor del resultado.
openssl.list_kdf_algorithms
sintaxis: ret = openssl.list_kdf_algorithms(hide_provider?)
Devuelve los algoritmos KDF disponibles en un array. Establece hide_provider a true para
ocultar el nombre del proveedor del resultado.
openssl.list_ssl_ciphers
sintaxis: cipher_string, err = openssl.list_ssl_ciphers(cipher_list?, ciphersuites?, protocol?)
Devuelve los cifrados SSL predeterminados como una cadena. cipher_list (anterior a TLSv1.3) y
ciphersuites (TLSv1.3) pueden usarse para expandir la configuración de cifrado que coincide con
protocol. OpenSSL 4.x rechaza "SSLv3" porque se ha eliminado el soporte para SSLv3.
openssl.list_ssl_ciphers()
openssl.list_ssl_ciphers("ECDHE-ECDSA-AES128-SHA")
openssl.list_ssl_ciphers("ECDHE-ECDSA-AES128-SHA", nil, "TLSv1.2")
openssl.list_ssl_ciphers("ECDHE-ECDSA-AES128-SHA", "TLS_CHACHA20_POLY1305_SHA256", "TLSv1.3")
resty.openssl.ctx
Un módulo para proporcionar cambios de contexto OSSL_LIB_CTX.
OSSL_LIB_CTX es un tipo de contexto de biblioteca OpenSSL interno. Las aplicaciones pueden asignar el suyo propio, pero también pueden usar NULL para usar un contexto predeterminado con funciones que toman un argumento OSSL_LIB_CTX.
Consulta OSSL_LIB_CTX.3 para una lectura más profunda.
El contexto es actualmente efectivo para los siguientes módulos:
- cipher
- digest
- kdf
- mac
- pkcs12.encode
- pkey
- provider
- rand
- x509, x509.csr, x509.crl y algunas funciones de x509.store
Este módulo está disponible en OpenSSL 3.0 o posterior.
ctx.new
sintaxis: ok, err = ctx.new(request_context_only?, conf_file?)
Crea un nuevo contexto y lo usa como contexto predeterminado para este módulo. Cuando
request_context_only se establece en verdadero, el contexto solo se utiliza dentro del contexto de la solicitud actual. conf_file puede especificar opcionalmente un archivo de configuración de OpenSSL
para crear el contexto.
El contexto creado se libera automáticamente con su ciclo de vida dado.
-- inicializa una instancia de cifrado AES desde la implementación del proveedor dada solo
-- para la solicitud actual, sin interferir en otras partes del código
-- o futuras solicitudes que utilicen el mismo algoritmo.
assert(require("resty.openssl.ctx").new(true))
local p = assert(require("resty.openssl.provider").load("myprovider"))
local c = require("resty.openssl.cipher").new("aes256")
print(c:encrypt(string.rep("0", 32), string.rep("0", 16), "🦢"))
-- no es necesario liberar el proveedor y ctx, se liberan automáticamente
ctx.free
sintaxis: ctx.free(request_context_only?)
Libera el contexto que fue creado previamente por ctx.new.
resty.openssl.err
Un módulo para proporcionar mensajes de error.
err.format_error
sintaxis: msg = err.format_error(ctx_msg?, return_code?, all_errors?)
sintaxis: msg = err.format_all_errors(ctx_msg?, return_code?)
Devuelve el último mensaje de error del último código de error. Los errores se formatean como:
[ctx_msg]: code: [return_code]: error:[error code]:[library name]:[func name]:[reason string]:[file name]:[line number]:
Para versiones de OpenSSL anteriores a 3.0, los errores se formatean como:
[ctx_msg]: code: [return_code]: [file name]:[line number]:error:[error code]:[library name]:[func name]:[reason string]:
Si all_errors se establece en true, se devolverán todos los errores, no solo el último, en una sola cadena. Todos los errores lanzados
por esta biblioteca internamente solo lanzan el último error.
Por ejemplo:
local f = io.open("t/fixtures/ec_key_encrypted.pem"):read("*a")
local privkey, err = require("resty.openssl.pkey").new(f, {
format = "PEM",
type = "pr",
passphrase = "wrongpasswrod",
})
ngx.say(err)
-- pkey.new:load_key: error:4800065:PEM routines:PEM_do_header:bad decrypt:crypto/pem/pem_lib.c:467:
err.get_last_error_code
sintaxis: code = err.get_last_error_code()
Devuelve el último código de error.
err.get_lib_error_string
sintaxis: lib_error_message = err.get_lib_error_string(code?)
Devuelve el nombre de la biblioteca del último código de error como cadena. Si code está establecido, devuelve el nombre de la biblioteca
correspondiente al código de error proporcionado en su lugar.
err.get_reason_error_string
sintaxis: reason_error_message = err.get_reason_error_string(code?)
Devuelve la razón del último código de error como cadena. Si code está establecido, devuelve la razón
correspondiente al código de error proporcionado en su lugar.
resty.openssl.version
Un módulo para proporcionar información de versión.
resty.openssl.provider
Módulo para interactuar con proveedores. Este módulo solo funciona en OpenSSL 3.0 o posterior.
provider.load
sintaxis: pro, err = provider.load(name, try?)
Carga el proveedor con name. Si try se establece en verdadero, OpenSSL no desactivará los
proveedores de respaldo si el proveedor no puede ser cargado e inicializado. Sin embargo, si el proveedor
se carga con éxito, los proveedores de respaldo se desactivan.
Por defecto, esta función carga el proveedor en el contexto predeterminado, lo que significa que afectará a otras aplicaciones en el mismo proceso que utilizan el contexto predeterminado también. Si tal comportamiento no es deseado, considera usar ctx para cargar el proveedor solo en un ámbito limitado.
provider.istype
sintaxis: ok = pkey.provider(table)
Devuelve true si la tabla es una instancia de provider. Devuelve false en caso contrario.
provider.is_available
sintaxis: ok, err = provider.is_available(name)
Verifica si un proveedor nombrado está disponible para su uso.
provider.set_default_search_path
sintaxis: ok, err = provider.set_default_search_path(name)
Especifica la ruta de búsqueda predeterminada que se utilizará para buscar proveedores.
provider:unload
sintaxis: ok, err = pro:unload(name)
Descarga un proveedor que fue cargado previamente por provider.load.
provider:self_test
sintaxis: ok, err = pro:self_test(name)
Ejecuta las pruebas de autocomprobación de un proveedor a demanda. Si las pruebas de autocomprobación fallan, el proveedor no podrá proporcionar más servicios y algoritmos.
provider:get_params
sintaxis: ok, err = pro:get_params(key1, key2?...)
Devuelve uno o más valores de parámetros del proveedor.
local pro = require "resty.openssl.provider"
local p = pro.load("default")
local name = assert(p:get_params("name"))
print(name)
-- outputs "OpenSSL Default Provider"
local result = assert(p:get_params("name", "version", "buildinfo", "status"))
print(require("cjson").encode(result))
-- outputs metadata del proveedor; la versión y la información de compilación varían según la versión de OpenSSL
resty.openssl.pkey
Módulo para interactuar con claves privadas y claves públicas (EVP_PKEY).
Cada tipo de clave puede soportar solo parte de las operaciones:
| Tipo de Clave | Cargar clave existente | Generación de clave | Cifrar/Descifrar | Firmar/Verificar | Intercambio de Clave |
|---|---|---|---|---|---|
| RSA | Y | Y | Y | Y | |
| DH | Y | Y | Y | ||
| EC | Y | Y | Y (ECDSA) | Y (ECDH) | |
| Ed25519 | Y | Y | Y (PureEdDSA) | ||
| X25519 | Y | Y | Y (ECDH) | ||
| Ed448 | Y | Y | Y (PureEdDSA) | ||
| X448 | Y | Y | Y (ECDH) |
No existe soporte directo para cifrado y descifrado para EC y ECX, pero procesos como ECIES son posibles con pkey:derive, kdf y cipher
pkey.new
Cargar clave existente
sintaxis: pk, err = pkey.new(string, opts?)
Soporta cargar una clave privada o pública en formato PEM, DER o JWK pasada como primer argumento string.
El segundo parámetro opts acepta una tabla opcional para restringir el comportamiento de carga de clave.
opts.format: establecer explícitamente a"PEM","DER","JWK"para cargar un formato específico o establecer a"*"para detección automáticaopts.type: establecer explícitamente a"pr"para clave privada,"pu"para clave pública; establecer a"*"para detección automática
Al cargar una clave RSA codificada en PEM, puede ser un SubjectPublicKeyInfo/PrivateKeyInfo codificado en PKCS#8 o un RSAPublicKey/RSAPrivateKey codificado en PKCS#1.
Al cargar una clave codificada en PEM cifrada, la passphrase para descifrarla puede establecerse
en opts.passphrase o opts.passphrase_cb:
pkey.new(pem_or_der_text, {
format = "*", -- elección de "PEM", "DER", "JWK" o "*" para detección automática
type = "*", -- elección de "pr" para clave privada, "pu" para clave pública y "*" para detección automática
passphrase = "contraseña secreta", -- la contraseña de cifrado PEM
passphrase_cb = function()
return "contraseña secreta"
end, -- la función de callback de contraseña de cifrado PEM
}
Al cargar JWK, hay un par de advertencias:
- Asegúrate de que el texto JSON codificado se pase, debe haber sido decodificado en base64.
- Restringir opts.type para claves JWK requiere OpenSSL 3.0 o posterior y
lua-resty-openssl 1.6.0 o posterior. Con OpenSSL 1.1.1 o versiones anteriores
de lua-resty-openssl, los parámetros en el JSON proporcionado decidirán si
se carga una clave privada o pública, especificar type resultará en un error;
además, la parte de clave pública para claves OKP (el parámetro x) no se respeta y
se deriva de la parte de clave privada (el parámetro d) si se especifica.
- Solo se soportan los tipos de clave RSA, P-256, P-384 y P-512 EC,
Ed25519, X25519, Ed448 y X448 OKP.
- Las firmas y verificaciones deben usar la opción ecdsa_use_raw para trabajar con estándares JWS
para claves EC. Consulta pkey:sign y pkey.verify para más detalles.
- Al ejecutarse fuera de OpenResty, es necesario instalar una biblioteca JSON (cjson o dkjson)
y basexx.
Generación de clave
sintaxis: pk, err = pkey.new(config?)
Genera una nueva clave pública o clave privada.
Para generar una clave RSA, la tabla config puede tener los campos bits y exp para controlar la generación de clave.
Cuando config se emite, esta función genera una clave RSA de 2048 bits con un exponente de 65537,
que es equivalente a:
local key, err = pkey.new({
type = 'RSA',
bits = 2048,
exp = 65537
})
Para generar una clave EC o DH, consulta pkey.paramgen para los posibles valores de
la tabla config. Por ejemplo:
local key, err = pkey.new({
type = 'EC',
curve = 'prime256v1',
})
También es posible pasar parámetros EC o DH codificados en PEM a config.param para la generación de clave:
local dhparam = pkey.paramgen({
type = 'DH',
group = 'dh_1024_160'
})
-- O
-- local dhparam = io.read("dhparams.pem"):read("*a")
local key, err = pkey.new({
type = 'DH',
param = dhparam,
})
También es posible pasar cadenas de control pkeyopt en bruto en la tabla config como se usa en el programa CLI genpkey.
Consulta openssl-genpkey(1) para una lista de opciones.
Por ejemplo:
pkey.new({
type = 'RSA',
bits = 2048,
exp = 65537,
})
-- es lo mismo que
pkey.new({
type = 'RSA',
exp = 65537,
"rsa_keygen_bits:4096",
})
Composición de clave
sintaxis: pk, err = pkey.new(config?)
Compone una clave pública o privada utilizando parámetros existentes. Para ver la lista de parámetros para cada clave, consulta pkey:set_parameters.
Solo type y params deben existir en la tabla config, todas las demás claves serán ignoradas.
local private_bn = require "resty.openssl.bn".new("7F48282CCA4C1A65D589C06DBE9C42AE50FBFFDF3A18CBB48498E1DE47F11BE1A3486CD8FA950D68F111970F922279D8", 16)
local p_384, err = assert(require("resty.openssl.pkey").new({
type = "EC",
params = {
private = private_bn,
group = "secp384r1",
}
}))
pkey.istype
sintaxis: ok = pkey.istype(table)
Devuelve true si la tabla es una instancia de pkey. Devuelve false en caso contrario.
pkey.paramgen
sintaxis: pem_txt, err = pk.paramgen(config)
Genera parámetros para clave EC o DH y los devuelve como texto codificado en PEM.
Para clave EC:
| Parámetro | Descripción |
|---|---|
| type | "EC" |
| curve | Curvas EC. Si se omite, se establece por defecto a "prime192v1". Para ver la lista de curvas EC soportadas, usa openssl ecparam -list_curves. |
Para clave DH:
| Parámetro | Descripción |
|---|---|
| type | "DH" |
| bits | Genera un nuevo parámetro DH con un primo de longitud bits. Si se omite, se establece por defecto a 2048. A partir de OpenSSL 3.0, solo se permite bits igual a 2048. |
| group | Usa grupos predefinidos en lugar de generar uno nuevo. bit se ignorará si group está establecido. |
Los valores posibles para group son:
- RFC7919 "ffdhe2048", "ffdhe3072",
"ffdhe4096", "ffdhe6144", "ffdhe8192"
- RFC5114 "dh_1024_160", "dh_2048_224", "dh_2048_256"
- RFC3526 "modp_1536", "modp_2048",
"modp_3072", "modp_4096", "modp_6144", "modp_8192"
local pem, err = pkey.paramgen({
type = 'EC',
curve = 'prime192v1',
})
local pem, err = pkey.paramgen({
type = 'DH',
group = 'ffdhe4096',
})
También es posible pasar cadenas de control pkeyopt en bruto en la tabla config como se usa en el programa CLI genpkey.
Consulta openssl-genpkey(1) para una lista de opciones.
pkey:get_provider_name
sintaxis: name = pkey:get_provider_name()
Devuelve el nombre del proveedor de pkey.
Esta función está disponible en OpenSSL 3.0 o posterior.
pkey:gettable_params, pkey:settable_params, pkey:get_param, pkey:set_params
Consulta los parámetros configurables o recuperables y establece o obtiene parámetros. Consulta Generic EVP parameter getter/setter.
pkey:get_parameters
sintaxis: parameters, err = pk:get_parameters()
Devuelve una tabla que contiene los parameters de la instancia de pkey.
pkey:set_parameters
sintaxis: ok, err = pk:set_parameters(params)
Establece los parámetros de la pkey desde una tabla params.
Si el parámetro no está establecido en la tabla params,
permanece intacto en la instancia de pkey.
local pk, err = require("resty.openssl.pkey").new()
local parameters, err = pk:get_parameters()
local e = parameters.e
ngx.say(e:to_number())
-- outputs 65537
local ok, err = pk:set_parameters({
e = require("resty.openssl.bn").from_hex("100001")
})
local ok, err = pk:set_parameters(parameters)
Parámetros para clave RSA:
| Parámetro | Descripción | Tipo |
|---|---|---|
| n | módulo común a ambas claves pública y privada | bn |
| e | exponente público | bn |
| d | exponente privado | bn |
| p | primer factor de n | bn |
| q | segundo factor de n | bn |
| dmp1 | d mod (p - 1), exponente1 |
bn |
| dmq1 | d mod (q - 1), exponente2 |
bn |
| iqmp | (InverseQ)(q) = 1 mod p, coeficiente |
bn |
Parámetros para clave EC:
| Parámetro | Descripción | Tipo |
|---|---|---|
| private | clave privada | bn |
| public | clave pública | bn |
| x | coordenada x de la clave pública | bn |
| y | coordenada y de la clave pública | bn |
| group | el grupo de curva nombrado | [NID] como número, cuando se pasa en como set_parameters(), también es posible usar la representación de texto. Esto es diferente de luaossl donde se devuelve una instancia de EC_GROUP. |
No es posible establecer x, y con public al mismo tiempo, ya que x y y son básicamente otra representación
de public. Además, actualmente solo es posible establecer x y y al mismo tiempo.
Parámetros para clave DH:
| Parámetro | Descripción | Tipo |
|---|---|---|
| private | clave privada | bn |
| public | clave pública | bn |
| p | módulo primo | bn |
| q | posición de referencia | bn |
| g | generador base | bn |
Parámetros para claves Curve25519 y Curve448:
| Parámetro | Descripción | Tipo |
|---|---|---|
| private | clave privada en bruto representada como bytes | string |
| public | clave pública en bruto representada como bytes | string |
pkey:is_private
sintaxis: ok = pk:is_private()
Verifica si pk es una clave privada. Devuelve verdadero si es una clave privada, devuelve falso si
es una clave pública.
pkey:get_key_type
sintaxis: obj, err = pk:get_key_type(nid_only?)
Devuelve un ASN1_OBJECT del tipo de clave de la clave privada como tabla.
A partir de lua-resty-openssl 1.6.0, se puede establecer un argumento opcional nid_only en true
para devolver solo el NID numérico de la clave.
local pkey, err = require("resty.openssl.pkey").new({type="X448"})
ngx.say(require("cjson").encode(pkey:get_key_type()))
-- outputs '{"ln":"X448","nid":1035,"sn":"X448","id":"1.3.101.111"}'
ngx.say(pkey:get_key_type(true))
-- outputs 1035
pkey:get_size
sintaxis: size, err = pk:get_size()
Devuelve el tamaño máximo adecuado para los búferes de salida para casi todas las operaciones que se pueden realizar con pkey.
Para clave RSA, este es el tamaño del módulo. Para claves EC, Ed25519 y Ed448, este es el tamaño de la clave privada. Para clave DH, este es el tamaño del módulo primo.
pkey:get_default_digest_type
sintaxis: obj, err = pk:get_default_digest_type()
Devuelve un ASN1_OBJECT del tipo de clave de la clave privada como tabla. Un campo adicional mandatory también se
devuelve en la tabla, si mandatory es verdadero entonces no se pueden usar otros resúmenes.
local pkey, err = require("resty.openssl.pkey").new()
ngx.say(require("cjson").encode(pkey:get_default_digest_type()))
-- outputs '{"ln":"sha256","nid":672,"id":"2.16.840.1.101.3.4.2.1","mandatory":false,"sn":"SHA256"}'
pkey:sign
sintaxis: signature, err = pk:sign(digest)
sintaxis: signature, err = pk:sign(message, md_alg?, padding?, opts?)
Realiza una firma de resumen utilizando la clave privada definida en la instancia de pkey.
El primer parámetro debe ser una instancia de resty.openssl.digest
o una cadena. Devuelve el texto firmado y un error si hay alguno.
Al pasar una instancia de digest como primer parámetro, no debe haberse llamado a final(); los usuarios solo deben usar update(). Este modo solo admite claves RSA y EC.
Al pasar una cadena como primer parámetro, el parámetro md_alg especificará el nombre
a utilizar al firmar. Cuando md_alg no está definido, para claves RSA y EC, esta función hace SHA256
por defecto. Para claves Ed25519 o Ed448, esta función realiza una firma PureEdDSA,
no se debe especificar ningún resumen y no se utilizará.
Para clave RSA, también es posible especificar el esquema de padding con las siguientes opciones:
pkey.PADDINGS = {
RSA_PKCS1_PADDING = 1,
RSA_SSLV23_PADDING = 2,
RSA_NO_PADDING = 3,
RSA_PKCS1_OAEP_PADDING = 4,
RSA_X931_PADDING = 5, -- solo firmar
RSA_PKCS1_PSS_PADDING = 6, -- solo firmar y verificar
}
Cuando padding es RSA_PKCS1_PSS_PADDING, es
posible especificar la longitud de sal de PSS estableciendo opts.pss_saltlen.
Para clave EC, esta función realiza una firma ECDSA.
Ten en cuenta que OpenSSL no admite la firma digital EC (ECDSA) con el
obsoleto algoritmo hash MD5 y devolverá un error en esta combinación. Consulta
EVP_DigestSign(3)
para una lista de algoritmos y algoritmos de clave pública asociados. Normalmente, la firma ECDSA
se codifica en formato ASN.1 DER. Si la tabla opts contiene un campo ecdsa_use_raw con
un valor verdadero, se devuelve un binario con solo la concatenación de la representación binaria pr y ps.
Esto es útil, por ejemplo, para enviar la firma como JWS.
opts es una tabla que acepta parámetros adicionales con las siguientes opciones:
{
pss_saltlen, -- Solo para modo PSS, esta opción especifica la longitud de la sal.
mgf1_md, -- Para el relleno PSS y OAEP establece el resumen MGF1. Si el resumen MGF1 no se establece explícitamente en modo PSS, entonces se utiliza el resumen de firma.
oaep_md, -- El resumen utilizado para la función hash OAEP. Si no se establece explícitamente, se utiliza SHA1.
}
También es posible pasar cadenas de control pkeyopt en bruto como se usa en el programa pkeyutl CLI. Esto permite a los usuarios pasar opciones que
no están explícitamente soportadas como parámetros arriba.
Consulta openssl-pkeyutl(1) para una lista de opciones.
pk:sign(message, nil, pk.PADDINGS.RSA_PKCS1_OAEP_PADDING, {
oaep_md = "sha256",
})
-- es lo mismo que
pk:sign(message, nil, nil, {
"rsa_padding_mode:oaep",
"rsa_oaep_md:sha256",
})
-- en pkeyutl CLI lo anterior es equivalente a: `openssl pkeyutl -sign -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
Para firmar un mensaje sin hacer un resumen del mensaje, consulta pkey:sign_raw.
pkey:verify
sintaxis: ok, err = pk:verify(signature, digest)
sintaxis: ok, err = pk:verify(signature, message, md_alg?, padding?, opts?)
Verifica una firma (que puede ser la cadena devuelta por pkey:sign). El segundo
argumento debe ser una instancia de resty.openssl.digest que utiliza
el mismo algoritmo de resumen que se utilizó en sign o una cadena. ok devuelve true si la verificación es
exitosa y false en caso contrario. Ten en cuenta que cuando la verificación falla, err no se establecerá cuando se use
con OpenSSL 1.1.1 o inferior.
Al pasar instancias de digest como segundo parámetro, no debe haberse llamado a final(); los usuarios solo deben usar update(). Este modo solo admite claves RSA y EC.
Al pasar una cadena como segundo parámetro, el parámetro md_alg especificará el nombre
a utilizar al verificar. Cuando md_alg no está definido, para claves RSA y EC, esta función hace SHA256
por defecto. Para claves Ed25519 o Ed448, esta función realiza una verificación PureEdDSA,
no se debe especificar ningún resumen y no se utilizará.
Cuando la clave es una clave RSA, la función acepta un argumento opcional padding cuyos valores
son los mismos que en pkey:sign. Cuando padding es RSA_PKCS1_PSS_PADDING, es
posible especificar la longitud de sal de PSS estableciendo opts.pss_saltlen.
Para clave EC, esta función realiza una verificación ECDSA. Normalmente, la firma ECDSA
debería estar codificada en formato ASN.1 DER. Si la tabla opts contiene un campo ecdsa_use_raw con
un valor verdadero, esta biblioteca tratará signature como la concatenación de la representación binaria pr y ps.
Esto es útil, por ejemplo, para verificar la firma como JWS.
opts es una tabla que acepta parámetros adicionales cuyas opciones
son las mismas que en pkey:sign.
-- Claves RSA y EC
local pk, err = require("resty.openssl.pkey").new()
local digest, err = require("resty.openssl.digest").new("SHA256")
digest:update("dog")
-- INCORRECTO:
-- digest:final("dog")
local signature, err = pk:sign(digest)
-- usa SHA256 por defecto
local signature, err = pk:sign("dog")
ngx.say(ngx.encode_base64(signature))
-- usa SHA256 y relleno PSS
local signature_pss, err = pk:sign("dog", "sha256", pk.PADDINGS.RSA_PKCS1_PSS_PADDING)
digest, err = require("resty.openssl.digest").new("SHA256")
digest:update("dog")
local ok, err = pk:verify(signature, digest)
-- usa SHA256 por defecto
local ok, err = pk:verify(signature, "dog")
-- usa SHA256 y relleno PSS
local ok, err = pk:verify(signature_pss, "dog", "sha256", pk.PADDINGS.RSA_PKCS1_PSS_PADDING)
-- Claves Ed25519 y Ed448
local pk, err = require("resty.openssl.pkey").new({
type = "Ed25519",
})
local signature, err = pk:sign("23333")
ngx.say(ngx.encode_base64(signature))
Para verificar un mensaje sin hacer un resumen del mensaje, consulta pkey:verify_raw y pkey:verify_recover.
pkey:encrypt
sintaxis: cipher_txt, err = pk:encrypt(txt, padding?, opts?)
Cifra el texto plano txt con una instancia de pkey, que debe contener una clave pública.
El segundo argumento opcional padding tiene el mismo significado que en pkey:sign.
Si se omite, padding se establece por defecto a pkey.PADDINGS.RSA_PKCS1_PADDING.
El tercer argumento opcional opts tiene el mismo significado que en pkey:sign.
pkey:decrypt
sintaxis: txt, err = pk:decrypt(cipher_txt, padding?, opts?)
Descifra el texto cifrado cipher_txt con una instancia de pkey, que debe contener una clave privada.
El segundo argumento opcional padding tiene el mismo significado que en pkey:sign.
Si se omite, padding se establece por defecto a pkey.PADDINGS.RSA_PKCS1_PADDING.
El tercer argumento opcional opts tiene el mismo significado que en pkey:sign.
local pkey = require("resty.openssl.pkey")
local privkey, err = pkey.new()
local pub_pem = privkey:to_PEM("public")
local pubkey, err = pkey.new(pub_pem)
local s, err = pubkey:encrypt("🦢", pkey.PADDINGS.RSA_PKCS1_PADDING)
ngx.say(#s)
-- outputs 256
local decrypted, err = privkey:decrypt(s)
ngx.say(decrypted)
-- outputs "🦢"
pkey:sign_raw
sintaxis: signature, err = pk:sign_raw(txt, padding?, opts?)
Firma el texto cifrado cipher_txt con una instancia de pkey, que debe contener una clave privada.
El segundo argumento opcional padding tiene el mismo significado que en pkey:sign.
Si se omite, padding se establece por defecto a pkey.PADDINGS.RSA_PKCS1_PADDING.
El tercer argumento opcional opts tiene el mismo significado que en pkey:sign.
Esta función también puede llamarse "cifrado privado" en algunas implementaciones como NodeJS o PHP. Ten en cuenta que a pesar del nombre de la función, esta función no es lo suficientemente segura como para considerarse cifrado. Al desarrollar nuevas aplicaciones, los usuarios deben usar pkey:sign para firmar con resumen, o pkey:encrypt para cifrado.
Consulta examples/raw-sign-and-recover.lua para un ejemplo.
pkey:verify_raw
sintaxis: ok, err = pk:verify_raw(signature, data, md_alg, padding?, opts?)
Verifica el texto cifrado signature con el mensaje data utilizando una instancia de pkey, que debe contener una clave pública.
Establece el resumen del mensaje a md_alg pero no calcula el resumen del mensaje
automáticamente; en otras palabras, esta función asume que data ya ha sido hasheado con md_alg.
Cuando md_alg no está definido, para claves RSA y EC, esta función hace SHA256 por defecto. Para claves Ed25519 o Ed448, no se establece ningún valor predeterminado.
El cuarto argumento opcional padding tiene el mismo significado que en pkey:sign.
Si se omite, padding se establece por defecto a pkey.PADDINGS.RSA_PKCS1_PADDING.
El quinto argumento opcional opts tiene el mismo significado que en pkey:sign.
Consulta examples/raw-sign-and-recover.lua para un ejemplo.
pkey:verify_recover
sintaxis: txt, err = pk:verify_recover(signature, padding?, opts?)
Verifica el texto cifrado signature con una instancia de pkey, que debe contener una clave pública, y también
devuelve el texto original que se firmó. Esta operación solo es compatible con la clave RSA.
El segundo argumento opcional padding tiene el mismo significado que en pkey:sign.
Si se omite, padding se establece por defecto a pkey.PADDINGS.RSA_PKCS1_PADDING.
El tercer argumento opcional opts tiene el mismo significado que en pkey:sign.
Esta función también puede llamarse "descifrado público" en algunas implementaciones como NodeJS o PHP.
Consulta examples/raw-sign-and-recover.lua para un ejemplo.
pkey:derive
sintaxis: txt, err = pk:derive(peer_key)
Deriva la clave compartida del algoritmo de clave pública peer_key, que debe ser una instancia de pkey.
Consulta examples/x25519-dh.lua para un ejemplo de cómo funciona el intercambio de claves para claves X25519 con el algoritmo DH.
pkey:tostring
sintaxis: txt, err = pk:tostring(private_or_public?, fmt?, is_pkcs1?)
Devuelve la clave privada o pública de la instancia de pkey en texto formateado en PEM.
El primer argumento debe ser una elección de public, PublicKey, private, PrivateKey o nil.
El segundo argumento fmt puede ser PEM, DER, JWK o nil.
Si ambos argumentos se omiten, esta función devuelve la representación PEM de la clave pública.
Si is_pkcs1 se establece en verdadero, la salida se codifica utilizando una estructura PKCS#1 RSAPublicKey;
la codificación PKCS#1 actualmente se admite para la clave RSA en formato PEM.
pkey:to_PEM
sintaxis: pem, err = pk:to_PEM(private_or_public?, is_pkcs1?)
Equivalente a pkey:tostring(private_or_public, "PEM", is_pkcs1).
resty.openssl.bn
Módulo para exponer la estructura BIGNUM. Nota: bignum es un entero grande, no se admiten operaciones de punto flotante (como la raíz cuadrada).
bn.new
sintaxis: b, err = bn.new(number?)
sintaxis: b, err = bn.new(string?, base?)
Crea una instancia de bn. El primer argumento puede ser:
nilpara crear una instancia bn vacía.- Un número Lua para inicializar la instancia bn.
- Una cadena para inicializar la instancia bn. El segundo argumento
baseespecifica la base de la cadena, y puede tomar valores (compatible con la API Ruby OpenSSL): 10o omitido, para cadena decimal ("23333")16, para cadena codificada en hex ("5b25")2, para cadena binaria ("\x5b\x25")0, para cadena formateada en MPI ("\x00\x00\x00\x02\x5b\x25")
MPI es un formato que consiste en la longitud del número en bytes representada como un número de 4 bytes en big-endian, y el número mismo en formato big-endian, donde el bit más significativo indica un número negativo (la representación de números con el MSB establecido se prefija con un byte nulo).
bn.dup
sintaxis: b, err = bn.dup(bn_ptr_cdata)
Duplica un BIGNUM* para crear una nueva instancia de bn.
bn.istype
sintaxis: ok = bn.istype(table)
Devuelve true si la tabla es una instancia de bn. Devuelve false en caso contrario.
bn.set
sintaxis: b, err = bn:set(number)
sintaxis: b, err = bn:set(string, base?)
Reutiliza la instancia bn existente y restablece su valor con el número o cadena dados. Consulta bn.new para el tipo de argumentos soportados.
bn.from_binary, bn:to_binary
sintaxis: bn, err = bn.from_binary(bin)
sintaxis: bin, err = bn:to_binary(padto?)
Crea una instancia de bn a partir de una cadena binaria.
Exporta el valor BIGNUM en cadena binaria.
bn:to_binary acepta un argumento numérico opcional padto que puede ser
utilizado para rellenar ceros a la izquierda en la salida a una longitud específica.
local to_hex = require "resty.string".to_hex
local b, err = require("resty.openssl.bn").from_binary("\x5b\x25")
local bin, err = b:to_binary()
ngx.say(to_hex(bin))
-- outputs "5b25"
bn.from_mpi, bn:to_mpi
sintaxis: bn, err = bn.from_mpi(bin)
sintaxis: bin, err = bn:to_mpi()
Crea una instancia de bn a partir de una cadena binaria formateada en MPI.
Exporta el valor BIGNUM en cadena binaria formateada en MPI.
local to_hex = require "resty.string".to_hex
local b, err = require("resty.openssl.bn").from_mpi("\x00\x00\x00\x02\x5b\x25")
local bin, err = b:to_mpi()
ngx.say(to_hex(bin))
-- outputs "000000025b25"
bn.from_hex, bn:to_hex
sintaxis: bn, err = bn.from_hex(hex)
sintaxis: hex, err = bn:to_hex()
Crea una instancia de bn a partir de una cadena codificada en hex. Ten en cuenta que no se debe incluir el prefijo 0x. Puede incluirse un prefijo - que indica el signo.
Exporta la instancia bn a cadena codificada en hex.
local bn = require("resty.openssl.bn")
local b = bn.from_hex("5B25")
local hex, err = b:to_hex()
ngx.say(hex)
-- outputs "5B25"
bn.from_dec, bn:to_dec
sintaxis: bn, err = bn.from_dec(dec)
sintaxis: dec, err = bn:to_dec()
Crea una instancia de bn a partir de una cadena decimal. Puede incluirse un prefijo - que indica el signo.
Exporta la instancia bn a cadena decimal.
local bn = require("resty.openssl.bn")
local b = bn.from_dec("23333")
local dec, err = b:to_dec()
ngx.say(dec)
-- outputs "23333"
bn:to_number
sintaxis: n, err = bn:to_number()
sintaxis: n, err = bn:tonumber()
Exporta los 32 bits o 64 bits más bajos (basado en el ABI) de la instancia bn
a un número. Esto es útil cuando los usuarios quieren realizar operaciones bit a bit.
local bn = require("resty.openssl.bn")
local b = bn.from_dec("23333")
local n, err = b:to_number()
ngx.say(n)
-- outputs 23333
ngx.say(type(n))
-- outputs "number"
bn.generate_prime
sintaxis: bn, err = bn.generate_prime(bits, safe)
Genera un número primo pseudoaleatorio de longitud de bits bits.
Si safe es verdadero, será un primo seguro (es decir, un primo p tal que (p-1)/2 también es primo).
El PRNG debe estar sembrado antes de llamar a BN_generate_prime_ex(). La generación de números primos tiene una probabilidad de error despreciable.
bn:__metamethods
Se pueden realizar varias operaciones matemáticas como si fuera un número.
local bn = require("resty.openssl.bn")
local a = bn.new(123456)
local b = bn.new(222)
-- lo siguiente devuelve un bn
local r
r = -a
r = a + b
r = a - b
r = a * b
r = a / b -- igual a bn:idiv, devuelve división entera
r = a % b
-- todas las operaciones se pueden realizar entre número y bignum
r = a + 222
r = 222 + a
-- lo siguiente devuelve un bool
local bool
bool = a < b
bool = a >= b
-- comparar entre número no funcionará
-- INCORRECTO: bool = a < 222
bn:add, bn:sub, bn:mul, bn:div, bn:exp, bn:mod, bn:gcd
sintaxis: r = a:op(b)
sintaxis: r = bn.op(a, b)
Realiza operaciones matemáticas op.
add: sumasub: restamul: multiplicardiv,idiv: división entera (división con redondeo hacia abajo al entero más cercano)exp,pow: lab-ésima potencia dea, esta función es más rápida que repetira * a * ....mod: módulogcd: el máximo divisor común deayb.
Ten en cuenta que add, sub, mul, div, mod también están disponibles con los operadores +, -, *, /, %.
Consulta sección anterior para ejemplos.
local bn = require("resty.openssl.bn")
local a = bn.new(123456)
local b = bn.new(9876)
local r
-- lo siguiente son iguales
r = a:add(b)
r = bn.add(a, b)
r = a:add(9876)
r = bn.add(a, 9876)
r = bn.add(123456, b)
r = bn.add(123456, 9876)
bn:sqr
sintaxis: r = a:sqr()
sintaxis: r = bn.sqr(a)
Calcula la 2-ésima potencia de a. Esta función es más rápida que r = a * a.
bn:mod_add, bn:mod_sub, bn:mod_mul, bn:mod_exp
sintaxis: r = a:op(b, m)
sintaxis: r = bn.op(a, b, m)
Realiza operaciones matemáticas módulo op.
mod_add: sumaaabmódulommod_sub: restabdeamódulommod_mul: multiplicaaporby encuentra el resto no negativo respecto al módulommod_exp,mod_pow: calculaaa lab-ésima potencia módulom(r=a^b % m). Esta función utiliza menos tiempo y espacio queexp. No llames a esta función cuandomsea par y cualquiera de los parámetros tenga la banderaBN_FLG_CONSTTIMEestablecida.
local bn = require("resty.openssl.bn")
local a = bn.new(123456)
local b = bn.new(9876)
local r
-- lo siguiente son iguales
r = a:mod_add(b, 3)
r = bn.mod_add(a, b, 3)
r = a:mod_add(9876, 3)
r = bn.mod_add(a, 9876, 3)
r = bn.mod_add(123456, b, 3)
r = bn.mod_add(123456, 9876, 3)
bn:mod_sqr
sintaxis: r = a:mod_sqr(m)
sintaxis: r = bn.mod_sqr(a, m)
Toma el cuadrado de a módulo m.
bn:lshift, bn:rshift
sintaxis: r = bn:lshift(bit)
sintaxis: r = bn.lshift(a, bit)
sintaxis: r = bn:rshift(bit)
sintaxis: r = bn.rshift(a, bit)
Desplazamiento de bits a a bit bits.
bn:is_zero, bn:is_one, bn:is_odd, bn:is_word
sintaxis: ok = bn:is_zero()
sintaxis: ok = bn:is_one()
sintaxis: ok = bn:is_odd()
sintaxis: ok, err = bn:is_word(n)
Verifica si bn es 0, 1, y número impar o un número n respectivamente.
bn:is_prime
sintaxis: ok, err = bn:is_prime(nchecks?)
Verifica si bn es un número primo. Devuelve true si es primo con una
probabilidad de error de menos de 0.25^nchecks y error si hay alguno. Si se omite,
nchecks se establece en 0, lo que significa seleccionar el número de iteraciones basado en el
tamaño del número.
Esta función realiza una prueba de primalidad probabilística de Miller-Rabin con nchecks iteraciones. Si nchecks == BN_prime_checks (0), se utiliza un número de iteraciones que produce una tasa de falsos positivos de como máximo 2^-64 para entradas aleatorias. La tasa de error depende del tamaño del primo y disminuye para primos más grandes. La tasa es 2^-80 a partir de 308 bits, 2^-112 a 852 bits, 2^-128 a 1080 bits, 2^-192 a 3747 bits y 2^-256 a 6394 bits.
Cuando la fuente del primo no es aleatoria o no es confiable, el número de verificaciones debe ser mucho mayor para alcanzar el mismo nivel de seguridad: debe ser igual a la mitad del nivel de seguridad objetivo en bits (redondeado al siguiente entero si es necesario). Por ejemplo, para alcanzar el nivel de seguridad de 128 bits, nchecks debe establecerse en 64.
Consulta también BN_is_prime(3).
resty.openssl.cipher
Módulo para interactuar con criptografía simétrica (EVP_CIPHER).
cipher.new
sintaxis: d, err = cipher.new(cipher_name, properties?)
Crea una instancia de cifrado. cipher_name es una cadena insensible a mayúsculas del nombre del algoritmo de cifrado.
Para ver una lista de algoritmos de cifrado implementados, usa
openssl.list_cipher_algorithms
o openssl list -cipher-algorithms.
A partir de OpenSSL 3.0, esta función acepta un parámetro opcional properties
para seleccionar explícitamente el proveedor para obtener algoritmos.
cipher.istype
sintaxis: ok = cipher.istype(table)
Devuelve true si la tabla es una instancia de cipher. Devuelve false en caso contrario.
cipher.set_buffer_size
sintaxis: ok = cipher.set_buffer_size(sz)
Redimensiona el tamaño del búfer interno utilizado por todas las instancias de cifrado. El tamaño de búfer predeterminado es de 1024 bytes.
Si esperas pasar texto de entrada mayor a 1024 bytes a la vez a update(), encrypt()
o decrypt(), establecer el búfer a un tamaño mayor que el tamaño de entrada esperado mejorará el rendimiento
al permitir que más código sea JIT-able.
Evita llamar a esta función en la ruta crítica, ya que esto reasigna el búfer cada vez que se llama.
cipher:get_provider_name
sintaxis: name = cipher:get_provider_name()
Devuelve el nombre del proveedor de cipher.
Esta función está disponible en OpenSSL 3.0 o posterior.
cipher:gettable_params, cipher:settable_params, cipher:get_param, cipher:set_params
Consulta los parámetros configurables o recuperables y establece o obtiene parámetros. Consulta Generic EVP parameter getter/setter.
cipher:encrypt
sintaxis: s, err = cipher:encrypt(key, iv?, s, no_padding?, aead_aad?)
Cifra el texto s con la clave key y el IV iv. Devuelve el texto cifrado en cadena binaria cruda
y un error si hay alguno.
Opcionalmente acepta un booleano no_padding que le dice al cifrado que habilite o deshabilite el relleno y por defecto
es false (habilitar relleno). Si no_padding es true, la longitud de s debe ser un múltiplo del
tamaño del bloque o se producirá un error.
Al usar el modo GCM o CCM o el cifrado chacha20-poly1305, también es posible pasar
los Datos Adicionales Autenticados (AAD) como el quinto argumento.
Esta función es un atajo de cipher:init, cipher:set_aead_aad (si corresponde) y luego cipher:final.
cipher:decrypt
sintaxis: s, err = cipher:decrypt(key, iv?, s, no_padding?, aead_aad?, aead_tag?)
Descifra el texto s con la clave key y el IV iv. Devuelve el texto descifrado en cadena binaria cruda
y un error si hay alguno.
Opcionalmente acepta un booleano no_padding que le dice al cifrado que habilite o deshabilite el relleno y por defecto
es false (habilitar relleno). Si no_padding es true, la longitud de s debe ser un múltiplo del
tamaño del bloque o se producirá un error; además, el relleno en el texto descifrado no se eliminará.
Al usar el modo GCM o CCM o el cifrado chacha20-poly1305, también es posible pasar
los Datos Adicionales Autenticados (AAD) como el quinto argumento y la etiqueta de autenticación
como el sexto argumento.
Esta función es un atajo de cipher:init, cipher:set_aead_aad (si corresponde),
cipher:set_aead_tag (si corresponde) y luego cipher:final.
cipher:init
sintaxis: ok, err = cipher:init(key, iv?, opts?)
Inicializa el cifrado con la clave key y el IV iv. El tercer argumento opcional es una tabla que consiste en:
{
is_encrypt = false,
no_padding = false,
}
Se necesita llamar a esta función antes de cipher:update y cipher:final si el cifrado no se ha inicializado ya. Pero no cipher:encrypt y cipher:decrypt.
Si deseas reutilizar la instancia cipher múltiples veces, es necesario llamar a esta función
para limpiar el estado interno del cifrado. Las funciones abreviadas
cipher:encrypt y cipher:decrypt
ya se encargan de la inicialización y el reinicio.
cipher:update
sintaxis: s, err = cipher:update(partial, ...)
Actualiza el cifrado con una o más cadenas. Si el cifrado tiene más datos que el tamaño del bloque para vaciar, la función devolverá una cadena no vacía como primer argumento. Esta función se puede usar de manera continua para cifrar o descifrar un flujo de datos continuo.
cipher:update_aead_aad
sintaxis: ok, err = cipher:update_aead_aad(aad)
Proporciona datos AAD al cifrado, esta función se puede llamar más de una vez.
cipher:get_aead_tag
sintaxis: tag, err = cipher:get_aead_tag(size?)
Obtiene la etiqueta de autenticación del cifrado con longitud especificada como size. Si se omite, se devolverá una etiqueta con longitud
de la mitad del tamaño del bloque.
Esta función solo se puede llamar después de que se haya terminado la cifrado.
cipher:set_aead_tag
sintaxis: ok, err = cipher:set_aead_tag(tag)
Establece la etiqueta de autenticación del cifrado con tag.
Esta función solo se puede llamar antes de que comience la descifrado.
cipher:final
sintaxis: s, err = cipher:final(partial?)
Devuelve el texto cifrado o descifrado en cadena binaria cruda, opcionalmente acepta una cadena para cifrar o descifrar.
-- cifrado
local c, err = require("resty.openssl.cipher").new("aes256")
c:init(string.rep("0", 32), string.rep("0", 16), {
is_encrypt = true,
})
c:update("🦢")
local cipher, err = c:final()
ngx.say(ngx.encode_base64(cipher))
-- outputs "vGJRHufPYrbbnYYC0+BnwQ=="
-- O:
local c, err = require("resty.openssl.cipher").new("aes256")
local cipher, err = c:encrypt(string.rep("0", 32), string.rep("0", 16), "🦢")
ngx.say(ngx.encode_base64(cipher))
-- outputs "vGJRHufPYrbbnYYC0+BnwQ=="
-- descifrado
local encrypted = ngx.decode_base64("vGJRHufPYrbbnYYC0+BnwQ==")
local c, err = require("resty.openssl.cipher").new("aes256")
c:init(string.rep("0", 32), string.rep("0", 16), {
is_encrypt = false,
})
c:update(encrypted)
local cipher, err = c:final()
ngx.say(cipher)
-- outputs "🦢"
-- O:
local c, err = require("resty.openssl.cipher").new("aes256")
local cipher, err = c:decrypt(string.rep("0", 32), string.rep("0", 16), encrypted)
ngx.say(cipher)
-- outputs "🦢"
Nota: en algunas implementaciones como libsodium o Java, los cifrados AEAD añaden la tag (o MAC)
al final del texto cifrado. En tales casos, los usuarios necesitarán cortar manualmente la tag
con el tamaño correcto (generalmente 16 bytes) y pasar el texto cifrado y la tag por separado.
Consulta examples/aes-gcm-aead.lua para un ejemplo de uso de modos AEAD con autenticación.
cipher:derive
sintaxis: key, iv, err = cipher:derive(key, salt?, count?, md?)
Deriva una clave y un IV (si corresponde) a partir del material dado que se puede utilizar en el cifrado actual. Esta función es útil principalmente para trabajar con claves que ya se han derivado del mismo algoritmo. Las aplicaciones más nuevas deben usar un algoritmo más moderno como PBKDF2 proporcionado por kdf.derive.
count es el número de iteraciones a realizar. Si se omite, se establece en 1. Ten en cuenta que las versiones recientes de la
herramienta CLI openssl enc utilizan automáticamente PBKDF2 si -iter se establece en un valor mayor que 1,
mientras que esta función no lo hará. Para usar PBKDF2 para derivar una clave, consulta kdf.derive.
md es el nombre del resumen a utilizar, puede tomar uno de los valores md2, md5, sha o sha1.
Si se omite, se establece por defecto en sha1.
local cipher = require("resty.openssl.cipher").new("aes-128-cfb")
local key, iv, err = cipher:derive("x")
-- equivalente a `openssl enc -aes-128-cfb -pass pass:x -nosalt -P -md sha1`
resty.openssl.digest
Módulo para interactuar con el resumen de mensajes (EVP_MD_CTX).
digest.new
sintaxis: d, err = digest.new(digest_name?, properties?)
Crea una instancia de resumen. digest_name es una cadena insensible a mayúsculas del nombre del algoritmo de resumen.
Para ver una lista de algoritmos de resumen implementados, usa
openssl.list_digest_algorithms o
openssl list -digest-algorithms.
Si se omite digest_name, se establece por defecto en sha1. Específicamente, el digest_name "null"
representa un resumen "nulo" que no hace nada: es decir, el hash que devuelve tiene longitud cero.
A partir de OpenSSL 3.0, esta función acepta un parámetro opcional properties
para seleccionar explícitamente el proveedor para obtener algoritmos.
digest.istype
sintaxis: ok = digest.istype(table)
Devuelve true si la tabla es una instancia de digest. Devuelve false en caso contrario.
digest:get_provider_name
sintaxis: name = digest:get_provider_name()
Devuelve el nombre del proveedor de digest.
Esta función está disponible en OpenSSL 3.0 o posterior.
digest:gettable_params, digest:settable_params, digest:get_param, digest:set_params
Consulta los parámetros configurables o recuperables y establece o obtiene parámetros. Consulta Generic EVP parameter getter/setter.
digest:update
sintaxis: ok, err = digest:update(partial, ...)
Actualiza el resumen con una o más cadenas.
digest:final
sintaxis: str, err = digest:final(partial?)
Devuelve el resumen en cadena binaria cruda, opcionalmente acepta una cadena para resumir.
```lua local d, err = require("resty.openssl.digest").new("sha256") d:update("🦢") local