{"id":609,"date":"2023-02-26T10:46:02","date_gmt":"2023-02-26T02:46:02","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=609"},"modified":"2023-04-29T20:23:14","modified_gmt":"2023-04-29T12:23:14","slug":"php-rsa-parameter-signature-and-verification","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/02\/26\/php-rsa-parameter-signature-and-verification\/","title":{"rendered":"PHP RSA\u53c2\u6570\u7b7e\u540d\u4e0e\u9a8c\u7b7e"},"content":{"rendered":"<p>\u4e3a\u4e86\u9632\u6b62\u5728\u652f\u4ed8\u901a\u4fe1\u8fc7\u7a0b\u4e2d\u7684\u53c2\u6570\u6570\u636e\u88ab\u7be1\u6539\u6216\u8005\u4f2a\u9020\uff0c\u91c7\u7528RSA\u8fdb\u884c\u6570\u636e\u7b7e\u540d\u548c\u9a8c\u8bc1\u7b7e\u540d\u3002<\/p>\n<p>RSA\u7b97\u6cd5\u662f\u4e00\u79cd\u975e\u5bf9\u79f0\u5bc6\u7801\u7b97\u6cd5\uff0c\u6240\u8c13\u975e\u5bf9\u79f0\uff0c\u5c31\u662f\u6307\u8be5\u7b97\u6cd5\u9700\u8981\u4e00\u5bf9\u5bc6\u94a5\uff0c\u4f7f\u7528\u5176\u4e2d\u4e00\u4e2a\u52a0\u5bc6\uff0c\u5219\u9700\u8981\u7528\u53e6\u4e00\u4e2a\u624d\u80fd\u89e3\u5bc6\u3002<\/p>\n<p><!-- more --><\/p>\n<h2>\u751f\u6210\u516c\u79c1\u94a5<\/h2>\n<p>\u751f\u6210 RSA \u79c1\u94a5 PEM \u6587\u4ef6\uff1a<\/p>\n<pre><code># openssl genrsa -out rsa_private_key.pem 2048<\/code><\/pre>\n<p>\u6839\u636e\u5df2\u7ecf\u751f\u6210\u7684\u79c1\u94a5\u518d\u751f\u6210\u516c\u94a5\uff1a<\/p>\n<pre><code># openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem<\/code><\/pre>\n<blockquote>\n<p>\u6ce8\u610f\uff1a\u751f\u6210\u540e\u7684rsa_private_key.pem\u79c1\u94a5\u4e0d\u80fd\u76f4\u63a5\u7528\u4e8eJava\u8fdb\u884c\u52a0\u5bc6\uff0c\u539f\u56e0\u662fJava\u4f7f\u7528\u7684PKCS#8\u683c\u5f0f\u7684\u79c1\u94a5\uff0c\u4f46PHP\u4e0d\u4f1a\u6709\u95ee\u9898\u3002Java\u7684keytool\u751f\u6210\u7684RSA\u516c\u94a5\u5bc6\u79c1\u94a5\u662f16\u8fdb\u5236\u5b57\u7b26\u4e32\uff0cPHP\u7528openssl\u751f\u6210\u7684\u516c\u94a5\u79c1\u94a5\u662f\u57fa\u4e8ebase64\u683c\u5f0f\u7684\u5b57\u7b26\u4e32\u6216\u8005\u4e8c\u8fdb\u5236\u683c\u5f0f\uff0c\u8fd9\u4e24\u79cd\u4e0d\u540c\u7684\u516c\u7ea6\u5bc6\u94a5\u5e76\u4e0d\u80fd\u76f4\u63a5\u8f6c\u5316\u3002<\/p>\n<\/blockquote>\n<h2>PHP\u52a0\u7b7e\u4e0e\u9a8c\u7b7e<\/h2>\n<pre><code class=\"language-php\">&lt;?php\n\n$data = &quot;name=Joe Ye&amp;blog=www.appblog.cn&amp;city=\u676d\u5dde&quot;;\n\n$sign = RSA::sign($data);\necho $sign;\necho &#039;&lt;br&gt;&#039;;\necho &#039;result: &#039; . RSA::verify($data, $sign);\n\nclass RSA\n{\n\n    public static function sign($data)\n    {\n        $priKey = file_get_contents(&#039;D:\/rsa_private_key.pem&#039;);\n        \/*\n        $priKey = &#039;-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA8Yf\/PlCkJlG72pKWkx+ZKbTiS\/hPmT1YtRz6d6bow0nROY5X\ne+mGcLhrqNBfUGGsdLYVN6Xa+\/YQYyvp9pXGMxmv5a22oFQXQhNX7+Gl0gE\/kXKq\nguIY0ztE+thmzabFl0+ZNR420la7cl13bJAdXybl8GBjFkXeUuZAkCWHN672JEuc\nrMPi6IUTNB+\/ksa0jsjge\/ixrawm9Hz+XuF8xIYPILSaWixgFibpHR6lEVrSLCnE\naTbSSO7ZQW5areMe37qoUl4osep\/eXXJCeCXgaBqExNa7n+LR5JFoMNCAtDsHSzP\nZ2moARBLVh0AcyyYq7Xwx9dW5uQ8UlQlfYADXwIDAQABAoIBAH+6re7kcoqZOsDy\nOJMBaNw3fl0yqdWeLaVJ9+MC76EnDnBjqDwtWR2PSc\/yshUuMidei4XsPgx1KmFn\nvcjbl\/86HF1YKnZLQil9VUnUiP6wDk\/61dV1gC9k7qvBeUxUX7YPMDR5EADYQTTP\n3PIanI3PYlZmgsAqntI0Vfxk\/EcjRpbGStGQ7yfXVwsNED6PaH63MTYXjP68V++2\nwKhH4aNJW6a1qNtKVCnmEyNewFhEQT4EG\/mUDphBWCA1AgK5XEH2gNBs+5UixN8h\nuNNAznKxADDoolipf6laObcxSZPyU2SwyFYIsFfkuLH8tXsDtbdywc\/kcbOLkSM5\nwtXQZhECgYEA\/YXc3YqXrTSFgSl8RwabfFDJQqjCq7P3963oQZkySvEB5NrYmqIy\nc0ZrzuSkTPK0cUv9LXjiv5JB502IdlDEEzhyEvnJNqkaSAXmw5UakPsI9hCVu8vg\n\/hZOrlEDQXfnERzbfveYWOX9BG2S+d4X1qmd9HxFVb+keeEnYoU5VeUCgYEA8+Qj\nt8raDV4H8LBUtPTw424OoFd7buuOZ8RWe0a1BAlMEL6ppCYopBy5wBwhJbyNoyyw\nHO53f06Zy+43gsaaxrpdUZ69bFatx+bbYgQeMUhEyslbk1Y8sXu0o+6Q+WXwBUni\nr90k+uVS02TE4o2gcfmFmyiOfdY9YEUo4Dkt3\/MCgYBgXJccpecM8J+l\/my8WmiT\nEenNqnOD6\/3eaH2VIXOaRIzhvcUC0Y+3fRbRJtrEXKP1RFrRA9e71Q2zqyapQf2l\nCJljWQn\/+rqAka2qvWvBm4lGbftbzBySt0vkueow4jAzsvJDCj0f3RsUqclpq98H\nuqTNHscD1rnfkZL0wYqPeQKBgQCJmJaGJI2sqPY11mWTyfT1eqwJzhE3XPH0nRJl\nbljFtDET6V1v3I9lN0ecmMIitiP6gUXCrM8CJegi43yx7TZ5E79+Qt5\/ds+ITjhL\nLiOSjkExXzSpBSgswawCKJ\/l9JrbgPnBWjR40FRQKzPg1SJF6w5zoQfy+qGZ5KrR\nBbFZ\/QKBgQC40Fe4hDlouBtkX9aQO2gj0m4cAcuJkZ5bkoiWUjOCMK5opTC01\/5q\nVjQyWn7tjESggCXKrY7a+HTGMJJH\/QM9yopVCI4kYXBoPO6s0R8jcGiTSnYRA\/K7\nuxjloGvgwqUxZhlwUXi6tct6gXEolNkPGDL5uUiQCV6gpBpih6l5pA==\n-----END RSA PRIVATE KEY-----&#039;;*\/\n\n        \/\/\u8f6c\u6362\u4e3aopenssl\u5bc6\u94a5\uff0c\u5fc5\u987b\u662f\u6ca1\u6709\u7ecf\u8fc7pkcs8\u8f6c\u6362\u7684\u79c1\u94a5\n        $res = openssl_get_privatekey($priKey);\n\n        \/\/\u8c03\u7528openssl\u5185\u7f6e\u7b7e\u540d\u65b9\u6cd5\uff0c\u751f\u6210\u7b7e\u540d$sign\n        \/\/openssl_sign($data, $sign, $res, OPENSSL_ALGO_MD5);\n        \/\/openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA1);\n        openssl_sign($data, $sign, $res);\n\n        openssl_free_key($res);\n\n        $sign = base64_encode($sign);\n        return $sign;\n    }\n\n    \/**\n     * RSA\u9a8c\u8bc1\u7b7e\u540d\n     * $data \u4e3a\u8981\u9a8c\u8bc1\u7684\u6570\u636e\u5b57\u7b26\u4e32\n     * $sign \u662f\u9700\u8981\u9a8c\u8bc1\u7684\u7b7e\u540d\u6570\u636e\uff0c\u662f\u76f4\u63a5\u4eceURL\u4e2d\u53d6\u5230\u7684$_POST[&quot;sign&quot;]\u578b\u53c2\u6570\uff0c\u51fd\u6570\u91cc\u9762\u4f1a\u8fdb\u884cbase64_decode\u7684\n     * return \u9a8c\u7b7e\u662f\u5426\u901a\u8fc7\uff0c\u4e3aBOOL\u503c\n     *\/\n    public static function verify($data, $sign)\n    {\n        \/\/\u8bfb\u53d6\u516c\u94a5\u6587\u4ef6,\u4e5f\u5c31\u662f\u7b7e\u540d\u65b9\u516c\u5f00\u7684\u516c\u94a5\uff0c\u7528\u6765\u9a8c\u8bc1\u8fd9\u4e2adata\u662f\u5426\u771f\u7684\u662f\u7b7e\u540d\u65b9\u53d1\u51fa\u7684\n        $pubKey = file_get_contents(&#039;D:\/rsa_public_key.pem&#039;);\n        \/*\n        $pubKey = &#039;-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8Yf\/PlCkJlG72pKWkx+Z\nKbTiS\/hPmT1YtRz6d6bow0nROY5Xe+mGcLhrqNBfUGGsdLYVN6Xa+\/YQYyvp9pXG\nMxmv5a22oFQXQhNX7+Gl0gE\/kXKqguIY0ztE+thmzabFl0+ZNR420la7cl13bJAd\nXybl8GBjFkXeUuZAkCWHN672JEucrMPi6IUTNB+\/ksa0jsjge\/ixrawm9Hz+XuF8\nxIYPILSaWixgFibpHR6lEVrSLCnEaTbSSO7ZQW5areMe37qoUl4osep\/eXXJCeCX\ngaBqExNa7n+LR5JFoMNCAtDsHSzPZ2moARBLVh0AcyyYq7Xwx9dW5uQ8UlQlfYAD\nXwIDAQAB\n-----END PUBLIC KEY-----&#039;;*\/\n\n        $res = openssl_get_publickey($pubKey);\n\n        \/\/\u8c03\u7528openssl\u5185\u7f6e\u65b9\u6cd5\u9a8c\u7b7e\uff0c\u8fd4\u56debool\u503c\n        $result = (bool) openssl_verify($data, base64_decode($sign), $res);\n\n        openssl_free_key($res);\n        return $result;\n    }\n}\n\n?&gt;<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e3a\u4e86\u9632\u6b62\u5728\u652f\u4ed8\u901a\u4fe1\u8fc7\u7a0b\u4e2d\u7684\u53c2\u6570\u6570\u636e\u88ab\u7be1\u6539\u6216\u8005\u4f2a\u9020\uff0c\u91c7\u7528RSA\u8fdb\u884c\u6570\u636e\u7b7e\u540d\u548c\u9a8c\u8bc1\u7b7e\u540d\u3002 RSA\u7b97\u6cd5\u662f\u4e00\u79cd\u975e\u5bf9\u79f0\u5bc6 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69],"tags":[108],"class_list":["post-609","post","type-post","status-publish","format-standard","hentry","category-php-basic","tag-rsa"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=609"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/609\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}