PHP实现组织与人员同步API接口
金蝶云社区-云社区用户9dcJ1234
云社区用户9dcJ1234
0人赞赏了该文章 2,670次浏览 未经作者许可,禁止转载编辑于2015年05月11日 20:43:07

因为项目要求,需要用PHP做轻应用开发后端,并实现组织与人员同步,核心难点是数据的加密。参考JAVA代码实现,并研究了RSA及AES在PHP上的一些实现方法之后,实现了该功能。

加密类:
[code]class kdweibo_encrypt {
public $key_path;
public $private_key;

function __construct($key_path) {
$this->key_path = $key_path;
}

// 将二进制的KEY文件转换为PEM格式的private key文件
private function get_private_key() {
$private_key_bin = file_get_contents($this->key_path);
$private_key_base64 = base64_encode($private_key_bin);
$private_key_pem = '';
for ($i = 0; $i < strlen($private_key_base64); $i+=64) {
$private_key_pem .= substr($private_key_base64, $i, 64);
$private_key_pem .= "\n";
}

$private_key_pem = "-----BEGIN PRIVATE KEY-----\n" . $private_key_pem . "-----END PRIVATE KEY-----";
return $private_key_pem;
}

// 对data加密
public function encrypt($data, $needBase64 = true) {
$result = '';

// 生成随机KEY,16字节,用来对data进行加密
$random_key = substr(uniqid('', true), 0, 16);

// 用RSA私钥对上面生成的随机KEY进行加密,密文长度为128字节(1024 / 8)
$private_key = openssl_pkey_get_private($this->get_private_key());
openssl_private_encrypt($random_key, $encrypted, $private_key);
$result .= $encrypted;

// 用AES对data进行加密,128位,ECB模式,PCK5 padding(JAVA的AES算法的默认值)
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');

// PCK5 padding实现
$block_size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$pad = $block_size - (strlen($data) % $block_size);
$data = $data . str_repeat(chr($pad), $pad);

$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $random_key, $iv);
$encrypted = mcrypt_generic($td, $data);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$result .= $encrypted;

return $needBase64 ? base64_encode($result) : $result;
}
}[/code]
测试代码(因为贴子里不能有URL,请将$url中的“|”改为“/”):
[code]$nonce = uniqid();
$eid = "xxxxx";
$data = '{"eid":"xxxxx","type":1,"array":["xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"]}';
$en = new kdweibo_encrypt('xxxx.key');
$data_encrypted = $en->encrypt($data);

$url = 'http:||mcloud.kingdee.com|openaccess|input|person|get';
$params = "nonce=".$nonce."&eid=".$eid."&data=".urlencode($data_encrypted);

$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: ' . strlen($params))
);
ob_start();
curl_exec($ch);
$return_content = ob_get_contents();
ob_end_clean();

echo $return_content;[/code]