php生成10位数字签名,2010-11-29 20:09 【转】php中数字签名与校验

1. 先用php生成一对公钥和私钥

$res =

openssl_pkey_new();

openssl_pkey_export($res,$pri);

$d=

openssl_pkey_get_details($res);

$pub =

$d['key'];

var_dump($pri,$pub);

输出依次为私钥和公钥的pem字串,如:

string(916)

"-----BEGIN PRIVATE

KEY-----

MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKs124okAnX5jh1Q

wsETi80b4ZyYlYUSsAtvS7ZG+GSLAox24TKNwWIy5cUdKfK/5QEJjZ0S8LjRSYCG

to9LkwQTQrKY8BBXVCQQS3VXRqz4on9bmcGSyLMK6vQxt9NnJpk6aBmJE7z35+8z

TTLwdUbYaMAcYqrsYDfgBSNBgwbDAgMBAAECgYBvolJfpFMmcW3El6AlHIWPW5qj

7KmxdxnqmssXMvdLN4iV5f24ZM2vJdjDydxMN+st3fjEblEfcPcoIq5uiKx2bnO3

f9g0yt+qUoXdz4LK6jV1NfuAZDcnBm7CXfE7BDREgyiRg4ZXIvp4L0Y2zBMdFTmg

LKkXb2M1P3pK53UbwQJBANupqPXFQjdHvAa3voT+UI8OhmLbw/Vyh6Ii1glwMfyq

VS2lAakj9d1hqLYZvw+eNeZBnzZNPuMJg5aj/WKUqasCQQDHiFLS7Yb1rbhfjmRt

ZL4zXuvX1hVjTNo2TeZwPniGpYa+QHcauDDep5C9q//n+D+ZtkbkECxpOVhrUHSI

KO9JAkEApl3lHd98uymVevEHVurWUMMLfSw9SlSn7WC9AwD6mwbW5G8oxtX5jOY+

RU1Sq52D7RSeZR40FvhJtXoWmudFaQJAc8E+a2epF/YENEtjL6N2RE8Y+0oTdlwr

a72dphhXy6VTmiPD9RhOIZ2MdrzF5Uk7fG0mi0Bmw1SlWvx93lABIQJBALXPeoNa

b4dQkRkfqCHtyrWOeRcC1Y6FyTfNj+cRBzdIcmFc21hxj6HKy2M6/XGI3rAE5L+B

mmlSmN1enhoCUqc=

-----END

PRIVATE KEY-----

"

string(272) "-----BEGIN PUBLIC

KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrNduKJAJ1+Y4dUMLBE4vNG+Gc

mJWFErALb0u2RvhkiwKMduEyjcFiMuXFHSnyv+UBCY2dEvC40UmAhraPS5MEE0Ky

mPAQV1QkEEt1V0as+KJ/W5nBksizCur0MbfTZyaZOmgZiRO89+fvM00y8HVG2GjA

HGKq7GA34AUjQYMGwwIDAQAB

-----END

PUBLIC KEY-----

"

2.

保存好自己的私钥,把公钥可以公开给别人。如果需要对某数据进行签名,证明那数据是从你这里发出的,就需要用私钥:

$res =

openssl_pkey_get_private($pri);

if (openssl_sign('hello', $out,

$res))

var_dump(base64_encode($out));

上例中 $pri 为自己的私钥,'hello'

为待签名的数据,如果签名成功,最后输出为base64编码后的签名,如:

j19H+C/NQEcyowezOQ+gmGi2UoPJNXyJ+KwpkEzJ5u4qaRD3cY4qhfFfIosypypwJTJ4LjRYOIPNQMQm6ICj2nMdGfn/p/pp7il+xGz2aUWdOXkJFgIc/PGC95C9sLH04Tc6QSuV5IMd9rjBjyv+ieokMLFm9cmtN2hGag9vq1s=

3.

别人收到你的数据 'hello' 和签名字串,想验证这是从你发来的数据的话,用你公开的公钥验证:

$sig =

base64_decode($sig);

$res = openssl_pkey_get_public($pubkey);

if

(openssl_verify('hello', $sig, $res) === 1)

; // 通过验证

上例中刚开始的 $sig

为之前你base64编码过的签名, $pubkey 为你的公钥

4、其他:

PHP使用微信支付V3生成签名的过程需要以下几个步骤: 1. **初始化配置**: 首先,确保你已经有了商户号、AppID、商户密钥(SecretKey)以及开放平台API证书(如需)。 2. **构建请求数据**: 创建一个包含交易相关的字段数组,例如: - `nonce_str`: 非对称加密随机字符串 - `timestamp`: 当前时间戳 - `package`: 支付请求的统一封装,如`prepay_id` 或 `jsapi_ticket` - `sign_type`: 签名类型,通常为`MD5` 或 `SHA256` - 其他根据支付场景所需的字段(如商品信息、用户信息等) 3. **设置数组排序**: 得到的请求参数需要按照指定的键字典序进行排序,保证每次请求参数的一致性。 4. **拼接字符串**: 将排序后的参数以"&"连接,并移除所有空值键值对。 5. **签名计算**: 使用商户密钥对上述拼接后的字符串进行哈希处理,生成签名。如果是MD5签名,使用`md5($string . "&key=" . $secretKey)`;如果是SHA256签名,可以使用`sha256($string . "&key=" . $secretKey)`。 6. **签名结果验证**: 在发送至微信服务器之前,将生成的签名和原始请求数据一起发送,微信会校验其真实性。 ```php // 示例代码片段 $param = [ 'appid' => 'your_appid', // ... 其他参数 'nonce_str' => uniqid(), // ... 排序并拼接参数 ]; ksort($param); $string_to_sign = ''; foreach ($param as $k => $v) { if (!empty($v)) { $string_to_sign .= $k . '=' . $v . '&'; } } // 移除最后一个 & $string_to_sign = rtrim($string_to_sign, '&'); $signature = hash('sha256', $string_to_sign . "&key={$your_secret_key}"); // 发送请求之前,将签名放入请求体或头部 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值