PHP 8.4.1 Released!

openssl_sign

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_signGenera una firma

Descripción

openssl_sign(
    string $data,
    string &$signature,
    mixed $priv_key_id,
    mixed $signature_alg = OPENSSL_ALGO_SHA1
): bool

openssl_sign() computa una firma para la información data especificada, generando una firma digital criptográfica usando la clave privada asociada con priv_key_id. Observe que la información misma no está encriptada.

Parámetros

data

El string de datos que se quieren firmar.

signature

Si la llamada tuvo éxito, la firma es devuelta en signature.

priv_key_id

resource - una clave, devuelta por openssl_get_privatekey()

string - una clave con formato PEM

signature_alg

int - uno de estos Algoritmos de firma.

string - un string válido devuelto por openssl_get_md_methods(); p.ej., "sha256WithRSAEncryption" o "sha384".

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de openssl_sign()

<?php
// se asume que $datos contiene la información que se va a firmar

// obtener la clave privada desde el fichero y prepararla
$pkeyid = openssl_pkey_get_private("file://src/openssl-0.9.6/demos/sign/key.pem");

// computar la firma
openssl_sign($datos, $firma, $pkeyid);

// liberar la clave de la memoria
openssl_free_key($pkeyid);
?>

Ejemplo #2 Ejemplo de openssl_sign()

<?php
// datos que se quieren firmar
$datos = 'mis datos';

// crear unas claves pública y privada nuevas
$new_key_pair = openssl_pkey_new(array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
));
openssl_pkey_export($new_key_pair, $private_key_pem);

$details = openssl_pkey_get_details($new_key_pair);
$public_key_pem = $details['key'];

// crear la firma
openssl_sign($datos, $firma, $private_key_pem, OPENSSL_ALGO_SHA256);

// guardar para después
file_put_contents('private_key.pem', $private_key_pem);
file_put_contents('public_key.pem', $public_key_pem);
file_put_contents('signature.dat', $firma);

// comprobar la firma
$r = openssl_verify($datos, $firma, $public_key_pem, "sha256WithRSAEncryption");
var_dump($r);
?>

Ver también

add a note

User Contributed Notes 2 notes

up
11
edmarw at yahoo dot com
17 years ago
This may help if you just want a real-simple private/public key pair:

<?php

$data
= "Beeeeer is really good.. hic...";

// You can get a simple private/public key pair using:
// openssl genrsa 512 >private_key.txt
// openssl rsa -pubout <private_key.txt >public_key.txt

// IMPORTANT: The key pair below is provided for testing only.
// For security reasons you must get a new key pair
// for production use, obviously.

$private_key = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6zxqlVzz0wy2j4kQVUC4Z
RZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQJAL151ZeMKHEU2c1qdRKS9
sTxCcc2pVwoAGVzRccNX16tfmCf8FjxuM3WmLdsPxYoHrwb1LFNxiNk1MXrxjH3R
6QIhAPB7edmcjH4bhMaJBztcbNE1VRCEi/bisAwiPPMq9/2nAiEA3lyc5+f6DEIJ
h1y6BWkdVULDSM+jpi1XiV/DevxuijMCIQCAEPGqHsF+4v7Jj+3HAgh9PU6otj2n
Y79nJtCYmvhoHwIgNDePaS4inApN7omp7WdXyhPZhBmulnGDYvEoGJN66d0CIHra
I2SvDkQ5CmrzkW5qPaE2oO7BSqAhRZxiYpZFb5CI
-----END RSA PRIVATE KEY-----
EOD;
$public_key = <<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6
zxqlVzz0wy2j4kQVUC4ZRZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQ==
-----END PUBLIC KEY-----
EOD;

$binary_signature = "";

// At least with PHP 5.2.2 / OpenSSL 0.9.8b (Fedora 7)
// there seems to be no need to call openssl_get_privatekey or similar.
// Just pass the key as defined above
openssl_sign($data, $binary_signature, $private_key, OPENSSL_ALGO_SHA1);

// Check signature
$ok = openssl_verify($data, $binary_signature, $public_key, OPENSSL_ALGO_SHA1);
echo
"check #1: ";
if (
$ok == 1) {
echo
"signature ok (as it should be)\n";
} elseif (
$ok == 0) {
echo
"bad (there's something wrong)\n";
} else {
echo
"ugly, error checking signature\n";
}

$ok = openssl_verify('tampered'.$data, $binary_signature, $public_key, OPENSSL_ALGO_SHA1);
echo
"check #2: ";
if (
$ok == 1) {
echo
"ERROR: Data has been tampered, but signature is still valid! Argh!\n";
} elseif (
$ok == 0) {
echo
"bad signature (as it should be, since data has beent tampered)\n";
} else {
echo
"ugly, error checking signature\n";
}

?>
up
4
tim at remitone dot com
1 year ago
It should be noted that the default signature algorithm used by openssl_sign() and openssl_verify (OPENSSL_ALGO_SHA1) is no longer supported by default in OpenSSL Version 3 series.

With an up to date OpenSSL library, one has to run
"update-crypto-policies --set LEGACY"
on the server where the library resides in order to allow these functions to work without the optional alternative algorithm argument.
To Top