php 生成签名及验证签名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
<?php /** * 根据原文生成签名内容 * * @param string $data 原文内容 * * @return string * @author confu */ function sign( $data ) { $filePath = 'test.p12' ; if (! file_exists ( $filePath )) { return false; } $pkcs12 = file_get_contents ( $filePath ); if (openssl_pkcs12_read( $pkcs12 , $certs , '读取证书所需要的密码' )) { $privateKey = $certs [ 'pkey' ]; //根据实际情况键值可能不同 $publicKey = $certs [ 'cert' ]; //根据实际情况键值可能不同 $binary_signature = "" ; if (openssl_sign( $data , $binarySignature , $privateKey , OPENSSL_ALGO_SHA1)) { return $binarySignature ; } else { return '' ; } } else { return '' ; } } /** * 验证签名自己生成的是否正确 * * @param string $data 签名的原文 * @param string $signature 签名 * * @return bool * @author confu */ function verifySign( $data , $signature ) { $filePath = 'test.p12' ; if (! file_exists ( $filePath )) { return false; } $pkcs12 = file_get_contents ( $filePath ); if (openssl_pkcs12_read( $pkcs12 , $certs , '读取证书所需要的密码' )) { $publicKey = $certs [ 'cert' ]; $ok = openssl_verify( $data , $signature , $publicKey ); if ( $ok == 1) { return true; } } return false; } /** * 验证返回的签名是否正确 * * @param string $data 要验证的签名原文 * @param string $signature 签名内容 * * @return bool * @author confu */ function verifyRespondSign( $data , $signature ) { $filePath = 'allinpay-pds.pem' ; if (! file_exists ( $filePath )) { return false; } $fp = fopen ( $filePath , "r" ); $cert = fread ( $fp , 8192); fclose( $fp ); $pubkeyid = openssl_get_publickey( $cert ); if (! is_resource ( $pubkeyid )) { return false; } $ok = openssl_verify( $data , $signature , $pubkeyid ); if ( $ok == 1) { openssl_free_key( $pubkeyid ); return true; } return false; } ?> |
openssl_sign 默认signature_alg参数是OPENSSL_ALGO_SHA1
如果使用DSA加密方式需要使用OPENSSL_ALGO_DSS1参数
signature_alg 其他参数
OPENSSL_ALGO_DSS1 (integer)
OPENSSL_ALGO_SHA1 (integer)
OPENSSL_ALGO_SHA224 (integer)
OPENSSL_ALGO_SHA256 (integer)
OPENSSL_ALGO_SHA384 (integer)
OPENSSL_ALGO_SHA512 (integer)
OPENSSL_ALGO_RMD160 (integer)
OPENSSL_ALGO_MD5 (integer)
OPENSSL_ALGO_MD4 (integer)
OPENSSL_ALGO_MD2 (integer)
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!