我目前正在维护支付宝网址生成库,此代码段中有一些有趣的事情(除了大量混淆的命名方案和功能放置)。
我有一个构建URL(使用create_linkstring()
)+其RSA签名(sign()
)对应的函数:
function build_mysign($sort_array,$key,$sign_type) {
$prestr = create_linkstring($sort_array);
$prestr = $prestr.$key;
$mysgin = sign($prestr,$sign_type);
return $mysgin;
}
这是我的create_linkstring()
方法:
function create_linkstring($array) {
$arg = "";
while (list ($key, $val) = each ($array)) {
$arg.=$key."=".$val."&";
}
$arg = substr($arg,0,count($arg)-2);
return $arg;
}
这是我的sign()
功能:
function sign($prestr){
$fprivate = fopen(dirname(__FILE__) . '/rsa_private_key.pem', 'r');
$priv_key = fread($fprivate, 123456);
fclose($fprivate);
$privatekeyid = openssl_get_privatekey($priv_key);
// Compute signature
openssl_sign($prestr, $signMsg, $privatekeyid, OPENSSL_ALGO_SHA1);
// Free the key from memory
openssl_free_key($privatekeyid);
$signMsg = base64_encode($signMsg);
return $signMsg;
}
它基本上需要一组键和值,并生成一个URL,然后使用sign()
方法对其进行签名。
这个库实际上有两种签名机制 - MD5和RSA。我编写了RSA签名函数,因为它默认不受支持。查看使用MD5签名的输出URL,sign=
是一个32字符串字符串,因此它看起来像sign=779d70d2b4d9b50cad3a4ce144726e9f
。
但是,使用我的RSA签名功能,输出是一个172字符串!输入如下所示:
&安培;签= WiYQIl0x + Vkey3SciP03HDv / 7IZKoq2 + OcvsSlQJb3NMElG6JawRc5b98ddJOOYjt9YK2YypwlFWgizj0b5wk + HNJB5lSYq7rDCcDGG0m0cKbW / m9P23J8gQaR1x6RovEDaWhs5zv4YTFe83hmPaf4Q / eVa2CpiixjpHd3kjybg =
如果我没错,RSA签名的字符串应该是128个字符长。我不太清楚为什么会这样。如果我用无关的字符串附加它,我不是100%,而且我注意到所有RSA签名的密钥都以=
结尾,这肯定是不对的。
答案 0 :(得分:1)
我猜你是在混淆RSA签名的字节长度和签名的base64编码的字符串长度。
如果您使用的是1024位RSA密钥(位短,顺便说一句),则签名的字节长度应为128字节长。字节可以是任何值,包括0
和其他不能用UTF-8或ASCII打印的字符(以及更多不适合在URL等中使用的字符)。因此,您的代码会对base64中的字节进行编码。 172个字符的大小(包括填充=
)恰到好处:128bytes / 1024bits
$ echo WiYQIl0x+Vkey3SciP03HDv/7IZKoq2+OcvsSlQJb3NMElG6JawRc5b98ddJOOYjt9YK2YypwlFWgizj0b5wk+HNJB5lSYq7rDCcDGG0m0cKbW/m9P23J8gQaR1x6RovEDaWhs5zv4YTFe83hmPaf4Q/eVa2CpiixjpHd3kjybg= \
| base64 --decode | hexdump -C
00000000 5a 26 10 22 5d 31 f9 59 1e cb 74 9c 88 fd 37 1c |Z&."]1.Y..t...7.|
00000010 3b ff ec 86 4a a2 ad be 39 cb ec 4a 54 09 6f 73 |;...J...9..JT.os|
00000020 4c 12 51 ba 25 ac 11 73 96 fd f1 d7 49 38 e6 23 |L.Q.%..s....I8.#|
00000030 b7 d6 0a d9 8c a9 c2 51 56 82 2c e3 d1 be 70 93 |.......QV.,...p.|
00000040 e1 cd 24 1e 65 49 8a bb ac 30 9c 0c 61 b4 9b 47 |..$.eI...0..a..G|
00000050 0a 6d 6f e6 f4 fd b7 27 c8 10 69 1d 71 e9 1a 2f |.mo....'..i.q../|
00000060 10 36 96 86 ce 73 bf 86 13 15 ef 37 86 63 da 7f |.6...s.....7.c..|
00000070 84 3f 79 56 b6 0a 98 a2 c6 3a 47 77 79 23 c9 b8 |.?yV.....:Gwy#..|
00000080