HMAC(散列消息认证码)
使用密钥和散列函数对消息进行加密,并用结果生成一个数字签名。
代码语言:javascript复制$message = '要计算HMAC的消息';
$shared_secret = '共享密钥';
$hmac = hash_hmac('sha256', $message, $shared_secret);
echo $hmac;
在上面的示例中,我们将要计算HMAC的消息作为第二个参数传递给hash_hmac函数。第三个参数是共享密钥,可以是任何字符串。第一个参数是散列算法,例如’sha256’。
此代码将计算SHA-256 HMAC,并输出它的十六进制表示形式。您可以根据需要更改散列算法和输入参数。
使用非对称加密算法,如RSA
利用私钥对消息进行加密,然后发送者将消息和数字签名一起发送给接收者。接收者使用发送者的公钥来验证数字签名是否有效。
代码语言:javascript复制// 生成公私钥对
$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扩展提供的函数来创建和验证数字证书,并使用它们对软件进行静态签名。
代码语言:javascript复制// 创建自签名证书
$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格式,该格式包括动态签名和加密的字节码。这样,即使代码被盗取或篡改,也无法执行未授权的操作。
代码语言:javascript复制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函数。
- 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是签名后得到的字符串。
- 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函数。
- 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函数判断签名结果是否相同,进而判断验签是否成功。
- 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生成数字签名的几种方法