php生成数字签名的几种方法

HMAC(散列消息认证码)
使用密钥和散列函数对消息进行加密,并用结果生成一个数字签名。

$message = '要计算HMAC的消息';
$shared_secret = '共享密钥';

$hmac = hash_hmac('sha256', $message, $shared_secret);

echo $hmac;

在上面的示例中,我们将要计算HMAC的消息作为第二个参数传递给hash_hmac函数。第三个参数是共享密钥,可以是任何字符串。第一个参数是散列算法,例如’sha256’。

此代码将计算SHA-256 HMAC,并输出它的十六进制表示形式。您可以根据需要更改散列算法和输入参数。

使用非对称加密算法,如RSA
利用私钥对消息进行加密,然后发送者将消息和数字签名一起发送给接收者。接收者使用发送者的公钥来验证数字签名是否有效。

// 生成公私钥对
$key_pair = openssl_pkey_new(array(
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA
));

// 获取私钥
openssl_pkey_export($key_pair, $private_key);

// 获取公钥
$public_key = openssl_pkey_get_details($key_pair)['key'];

// 要签名的消息
$message = "要签名的消息";

// 使用私钥对消息进行签名
openssl_sign($message, $signature, $private_key, OPENSSL_ALGO_SHA256);

// 验证签名
$valid = openssl_verify($message, $signature, $public_key, OPENSSL_ALGO_SHA256);

if ($valid === 1) {
    echo "签名验证成功!";
} else {
    echo "签名验证失败!";
}

在上面的示例中,我们首先生成了一个RSA密钥对,然后从中提取了私钥和公钥。接着,我们定义了要签名的消息,并使用openssl_sign函数使用私钥对消息进行签名。签名结果存储在$signature变量中。

最后,我们使用openssl_verify函数来验证签名。如果签名有效,则该函数返回1,否则返回0或-1。在本示例中,我们将签名与原始消息一起验证。如果您需要将签名发送给其他人以供验证,请将签名和消息分开传输。

需要注意的是,此示例仅用于演示目的。在实际应用中,您需要使用更多的安全措施来保护私钥和签名,并防止中间人攻击、重放攻击等安全威胁。

静态签名

静态签名是指使用数字证书对软件包进行加密的方法,以验证其完整性和来源。这可以防止未经授权的修改和分发。

使用OpenSSL扩展提供的函数来创建和验证数字证书,并使用它们对软件进行静态签名。

// 创建自签名证书
$private_key = openssl_pkey_new(array(
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA
));

$csr = openssl_csr_new(array(
    'commonName' => 'example.com'
), $private_key);

$cert = openssl_csr_sign($csr, null, $private_key, 365);

// 将证书保存到文件中
openssl_x509_export_to_file($cert, 'example.crt');

// 加载证书
$cert_data = file_get_contents('example.crt');
$cert = openssl_x509_read($cert_data);

// 静态签名
$data = file_get_contents('example.exe');
$signature = '';
openssl_pkcs7_sign(null, $signature, $cert, array($private_key), array(), PKCS7_BINARY, $data);

// 将签名保存到文件中
file_put_contents('example.exe.sig', $signature);

动态签名
动态签名是指在编译时或运行时动态生成签名,以确保代码完整性和来源。在PHP中,可以使用Zend扩展提供的Zend Guard技术来实现动态签名。

Zend Guard是一种商业级产品,用于对PHP源代码进行加密和编译。它可以将原始PHP代码编译为Zend Optimizer格式,该格式包括动态签名和加密的字节码。这样,即使代码被盗取或篡改,也无法执行未授权的操作。

php
// 加载 Zend Guard 运行时库
zend_loader_install_license('your_license_key');

// 加载加密和编译后的代码
require_once 'encoded_file.php';

// 从编码文件中提取动态签名
$signature = zend_loader_current_file_signature();

在上面的示例中,我们首先加载了Zend Guard运行时库,并使用许可证密钥进行授权。然后,我们加载编码和加密后的PHP代码,并使用zend_loader_current_file_signature函数提取动态签名。

需要注意的是,由于Zend Guard是一种商业产品,因此需要购买许可证才能使用。另外,虽然Zend Guard可以提供额外的安全性,但它并不能完全保护代码不被破解或篡改。建议您采取其他附加措施来增强代码的安全性和完整性。

 

PHP中的签名和验签

一、签名与验签的概念

签名是指在数字签名算法的基础上,对数据进行加密处理,生成一段特定的字符串。通过该字符串可以验证数据的完整性和真实性,防止数据被篡改、假冒。验签则是指对签名后的字符串进行解密处理,以验证解密后的数据的真实性和完整性。

二、PHP中的签名函数

在PHP中,签名函数主要包括hash_hmac和openssl_sign函数。

  1. hash_hmac函数

hash_hmac函数是PHP自带的一个哈希加密函数,支持多种哈希算法,如MD5、SHA-1、SHA-256等。使用该函数进行签名的步骤如下:

 

1

2

3

4

$algorithm = "sha256"; // 签名算法

$key = "abcdefg"; // 签名的密钥

$data = "hello world"; // 待签名的数据

$signature = hash_hmac($algorithm, $data, $key); // 签名结果

在上述代码中,$algorithm指定了算法类型,$key是签名的密钥,$data是待签名的数据,$signature是签名后得到的字符串。

  1. openssl_sign函数

openssl_sign函数是PHP中的openssl扩展函数,支持多种加密算法,使用该函数进行签名的步骤如下:

 

1

2

3

4

$algorithm = "sha256"; // 签名算法

$key = "abcdefg"; // 签名的密钥

$data = "hello world"; // 待签名的数据

openssl_sign($data, $signature, $key, $algorithm); // 签名结果

在上述代码中,$algorithm指定了算法类型,$key是签名的密钥,$data是待签名的数据,$signature是签名后得到的字符串。

三、PHP中的验签函数

在PHP中,验签函数主要包括hash_hmac和openssl_verify函数。

  1. hash_hmac函数

对于使用hash_hmac函数进行签名的数据,使用其进行验签的步骤如下:

 

1

2

3

4

5

6

7

8

9

10

11

$algorithm = "sha256"; // 签名算法

$key = "abcdefg"; // 签名的密钥

$data = "hello world"; // 待签名的数据

$signature = hash_hmac($algorithm, $data, $key); // 签名结果

// 验证签名

if (hash_equals($signature, hash_hmac($algorithm, $data, $key))) {

    echo "验签成功!";

} else {

    echo "验签失败!";

}

在上述代码中,先使用hash_hmac函数对数据进行签名,得到signature字符串。然后使用hash_equals函数判断签名结果是否相同,进而判断验签是否成功。

  1. openssl_verify函数

对于使用openssl_sign函数进行签名的数据,使用其进行验签的步骤如下:

 

1

2

3

4

5

6

7

8

9

10

11

$algorithm = "sha256"; // 签名算法

$key = "abcdefg"; // 签名的密钥

$data = "hello world"; // 待签名的数据

openssl_sign($data, $signature, $key, $algorithm); // 签名结果

// 验证签名

if (openssl_verify($data, $signature, $key, $algorithm) === 1) {

    echo "验签成功!";

} else {

    echo "验签失败!";

}

在上述代码中,先使用openssl_sign函数对数据进行签名,得到signature字符串。然后使用openssl_verify函数判断签名结果是否正确,进而判断验签是否成功。

未经允许不得转载:肥猫博客 » php生成数字签名的几种方法

赞 (0)
分享到: 更多

评论 0