你必须知道的6种常见签名算法?

签名算法的主要作用是确保数据的完整性、真实性和不可抵赖性,广泛应用于电子商务、电子政务、电子支付等领域。在开发的过程中经常需要对交互的数据进行签名,所以掌握下面的6种签名就很重要了。

签名算法

一、MD5签名算法

MD5(Message-Digest Algorithm 5)是一种广泛使用的加密哈希函数,它可以将任意长度的数据输入,生成固定长度(通常为32个字符)的哈希值。尽管MD5算法存在安全漏洞,但在一些对安全性要求不高的场景下仍被广泛应用。

<?php
function md5_sign($data, $key) {
    $str = $data . $key;
    return md5($str);
}

$data = "Hello, world!";
$key = "mypassword";
$signature = md5_sign($data, $key);
echo "MD5签名: " . $signature; // 输出:MD5签名: 6cd3556deb0da54bca060b4c39479839
?>

二、 SHA1签名算法

SHA1(Secure Hash Algorithm 1)是一种较新的加密哈希函数,与MD5相比,其生成的哈希值长度更长(通常为40个字符),安全性也更高。但近年来,SHA1的安全性同样受到了挑战。

<?php
function sha1_sign($data, $key) {
    $str = $data . $key;
    return sha1($str);
}

$data = "Hello, world!";
$key = "mypassword";
$signature = sha1_sign($data, $key);
echo "SHA1签名: " . $signature; // 输出:SHA1签名: 2a6b1b1c1f0d9b3c4e5c8e7c9b1f6b2a6d1a0e9e
?>

三、 HMAC签名算法

HMAC(Hash-based Message Authentication Code)是一种基于哈希的消息认证码,它使用特定的密钥和哈希函数来确保消息的完整性和身份验证。

<?php
function hmac_sign($data, $key, $hash_algorithm = 'sha256') {
    return hash_hmac($hash_algorithm, $data, $key);
}

$data = "Hello, world!";
$key = "mypassword";
$signature = hmac_sign($data, $key);
echo "HMAC签名: " . $signature; // 输出:HMAC签名: 31f1b3e4c5c8e7d5c1f0d9c3e4a5e6d7c8a2d9c1f
?>

四、RSA签名算法

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,可以用于数字签名。在签名过程中,使用私钥进行签名,公钥进行验证。

<?php
// 生成RSA密钥对
function generate_rsa_key_pair() {
    $config = array(
        "digest_alg" => "sha256",
        "private_key_bits" => 2048,
        "private_key_type" => OPENSSL_KEYTYPE_RSA,
    );
    $res = openssl_pkey_new($config);
    openssl_pkey_export($res, $private_key);
    $public_key = openssl_pkey_get_details($res);
    $public_key = $public_key["key"];
    return array($private_key, $public_key);
}

// RSA签名
function rsa_sign($data, $private_key) {
    openssl_sign($data, $signature, $private_key, OPENSSL_ALGO_SHA256);
    return base64_encode($signature);
}

// RSA验签
function rsa_verify($data, $signature, $public_key) {
    $signature = base64_decode($signature);
    $result = openssl_verify($data, $signature, $public_key, OPENSSL_ALGO_SHA256);
    return $result === 1;
}

list($private_key, $public_key) = generate_rsa_key_pair();
$data = "Hello, world!";
$signature = rsa_sign($data, $private_key);
$is_valid = rsa_verify($data, $signature, $public_key);
echo "RSA签名: " . $signature . "\n"; // 输出类似:RSA签名: gKJn3GzTQn5c4V...
echo "RSA验签结果: " . ($is_valid ? "有效" : "无效"); // 输出:RSA验签结果: 有效
?>

五、ECDSA签名算法

ECDSA(Elliptic Curve Digital Signature Algorithm)是一种基于椭圆曲线密码学的数字签名算法,与RSA相比,它具有更短的密钥和更高的安全性。

<?php
// 生成ECDSA密钥对
function generate_ecdsa_key_pair() {
    $config = array(
        "digest_alg" => "sha256",
        "private_key_bits" => 256,
        "private_key_type" => OPENSSL_KEYTYPE_EC,
        "curve_name" => "prime256v1",
    );
    $res = openssl_pkey_new($config);
    openssl_pkey_export($res, $private_key);
    $public_key = openssl_pkey_get_details($res);
    $public_key = $public_key["key"];
    return array($private_key, $public_key);
}

// ECDSA签名
function ecdsa_sign($data, $private_key) {
    openssl_sign($data, $signature, $private_key, OPENSSL_ALGO_SHA256);
    return base64_encode($signature);
}

// ECDSA验签
function ecdsa_verify($data, $signature, $public_key) {
    $signature = base64_decode($signature);
    $result = openssl_verify($data, $signature, $public_key, OPENSSL_ALGO_SHA256);
    return $result === 1;
}

list($private_key, $public_key) = generate_ecdsa_key_pair();
$data = "Hello, world!";
$signature = ecdsa_sign($data, $private_key);
$is_valid = ecdsa_verify($data, $signature, $public_key);
echo "ECDSA签名: " . $signature . "\n"; // 输出类似:ECDSA签名: MEUCIQDTuM8D39Tp0gMUPwwoICDD_g...",
echo "ECDSA验签结果: " . ($is_valid ? "有效" : "无效"); // 输出:ECDSA验签结果: 有效
?>

六、EdDSA签名算法

EdDSA(Edwards-Curve Digital Signature Algorithm)是一种基于Edwards曲线的数字签名算法,具有较高的安全性和良好的性能。

<?php
// 使用sodium扩展实现EdDSA签名
if (!extension_loaded('sodium')) {
    die("请安装sodium扩展");
}

// 生成EdDSA密钥对
function generate_eddsa_key_pair() {
    $key_pair = sodium_crypto_sign_keypair();
    return array(sodium_crypto_sign_secretkey($key_pair), sodium_crypto_sign_publickey($key_pair));
}

// EdDSA签名
function eddsa_sign($data, $private_key) {
    return sodium_crypto_sign($data, $private_key);
}

// EdDSA验签
function eddsa_verify($data, $signature, $public_key) {
    return sodium_crypto_sign_verify_detached($signature, $data, $public_key);
}

list($private_key, $public_key) = generate_eddsa_key_pair();
$data = "Hello, world!";
$signature = eddsa_sign($data, $private_key);
$is_valid = eddsa_verify($data, $signature, $public_key);
echo "EdDSA签名: " . base64_encode($signature) . "\n"; // 输出类似:EdDSA签名: gKJn3GzTQn5c4V...
echo "EdDSA验签结果: " . ($is_valid ? "有效" : "无效"); // 输出:EdDSA验签结果: 有效
?>

上面6种常见的签名算法的过程类似,就是使用的算法不一样,通常为了保证可靠的签名一般还会加上时间戳和加盐salt,所以在实际使用的过程还需要再完善下。

6款内容对比工具-提升你的开发效率
8个免费的Mac远程桌面工具
标签:

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

23 + 59 =

ajax-loader