EncryptionHelper.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace common\helpers;
  3. use yii\web\UnprocessableEntityHttpException;
  4. /**
  5. * Class EncryptionHelper
  6. * @package common\helpers
  7. * @author jianyan74 <751393839@qq.com>
  8. */
  9. class EncryptionHelper
  10. {
  11. /**
  12. * rsa加密
  13. * openssl genrsa -out rsa_private_key.pem 1024 // 生成原始 RSA私钥文件 rsa_private_key.pem
  14. * openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem // 将原始 RSA私钥转换为 pkcs8格式
  15. * openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem // 生成RSA公钥 rsa_public_key.pem
  16. *
  17. * @param string $data 数据
  18. * @param string $rsaPrivateKey 私钥PEM文件的绝对路径
  19. * @return string
  20. */
  21. public static function rsaEnCode($data, $rsaPrivateKey)
  22. {
  23. /* 获取私钥PEM文件内容 */
  24. $priKey = file_get_contents($rsaPrivateKey);
  25. /* 从PEM文件中提取私钥 */
  26. $res = openssl_get_privatekey($priKey);
  27. /* 对数据进行签名 */
  28. //openssl_sign($data, $sign, $res);
  29. openssl_private_encrypt($data, $sign, $res);
  30. /* 释放资源 */
  31. openssl_free_key($res);
  32. /* 对签名进行Base64编码,变为可读的字符串 */
  33. $sign = base64_encode($sign);
  34. return $sign;
  35. }
  36. /**
  37. * rsa解密
  38. *
  39. * @param string $data 加密后的数据
  40. * @param string $rsaPublicKey 公钥PEM文件的绝对路径
  41. * @return mixed
  42. */
  43. public static function rsaDeCode($data, $rsaPublicKey)
  44. {
  45. /* 获取公钥PEM文件内容 */
  46. $pubKey = file_get_contents($rsaPublicKey);
  47. /* 从PEM文件中提取公钥 */
  48. $res = openssl_get_publickey($pubKey);
  49. /* 对数据进行解密 */
  50. openssl_public_decrypt(base64_decode($data), $decrypted, $res);
  51. /* 释放资源 */
  52. openssl_free_key($res);
  53. return $decrypted;
  54. }
  55. /**
  56. * 创建参数(包括签名的处理)
  57. *
  58. * $paramArr = [
  59. * 'time' => time(),
  60. * 'nonceStr' => \common\helpers\StringHelper::random(8),
  61. * 'appId' => 'doormen',
  62. * ]
  63. * @param array $paramArr 变量参数
  64. * @param string $secret 秘钥(appSecret)
  65. * @return string
  66. */
  67. public static function createUrlParam(array $paramArr, $secret, $signName = 'sign')
  68. {
  69. $paraStr = "";
  70. ksort($paramArr);
  71. foreach ($paramArr as $key => $val) {
  72. if ($key != '' && $val != '') {
  73. $paraStr .= $key . '=' . urlencode($val) . '&';
  74. }
  75. }
  76. // 去掉最后一个&
  77. $paraStr = substr($paraStr, 0, strlen($paraStr) - 1);
  78. $signStr = $paraStr . $secret;// 排好序的参数加上secret,进行md5
  79. $sign = strtolower(md5($signStr));
  80. $paraStr .= '&';
  81. $paraStr .= $signName . '=' . $sign;// 将md5后的值作为参数,便于服务器的效验
  82. return $paraStr;
  83. }
  84. /**
  85. * 解密url
  86. *
  87. * @param array $paramArr
  88. * @param $secret
  89. * @param string $signName
  90. * @return bool
  91. * @throws UnprocessableEntityHttpException
  92. */
  93. public static function decodeUrlParam(array $paramArr, $secret, $signName = 'sign')
  94. {
  95. $sign = $paramArr[$signName];
  96. unset($paramArr[$signName]);
  97. ksort($paramArr);
  98. $signStr = '';
  99. foreach ($paramArr as $key => $val) {
  100. $signStr .= $key . '=' . urlencode($val) . '&';
  101. }
  102. // 去掉最后一个&
  103. $signStr = substr($signStr, 0, strlen($signStr) - 1);
  104. // 排好序的参数加上secret,进行md5
  105. $signStr .= $secret;
  106. if (strtolower(md5($signStr)) !== $sign) {
  107. $message = '签名错误';
  108. YII_DEBUG && $message .= ':' . $signStr;
  109. throw new UnprocessableEntityHttpException($message);
  110. }
  111. if (time() - $paramArr['time'] > 60) {
  112. throw new UnprocessableEntityHttpException('时间已过期');
  113. }
  114. return true;
  115. }
  116. }
粤ICP备19079148号