最近在使用PHP 中 firebase/php-jwt ,需要選擇加密算法,選擇了RSA算法,需要使用openssl來生成密鑰。把生成方式使用記錄下來。
簡單定義:公鑰和私鑰,加密和解密使用的是兩個不同的密鑰,所以是非對稱
系統:ubuntu 18.04
軟件:openssl java php
生成公鑰私鑰
使用命令生成私鑰:
openssl genrsa -out rsa_private_key.pem 1024
參數:genrsa 生成密鑰 -out 輸出到文件 rsa_private_key.pem 文件名 1024 長度
從私鑰中提取公鑰:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
參數: rsa 提取公鑰 -in 從文件中讀入 rsa_private_key.pem 文件名 -pubout 輸出 -out 到文件 rsa_public_key.pem 文件名
使用openssl加解密:
新建一個readme.txt 內容是taoshihan
使用公鑰加密:
openssl rsautl -encrypt -in readme.txt -inkey rsa_public_key.pem -pubin -out hello.en
參數: rsautl 加解密 -encrypt 加密 -in 從文件輸入 readme.txt 文件名 -inkey 輸入的密鑰 rsa_public_key.pem 上一步生成的公鑰 -pubin 表名輸入是公鑰文件 -out輸出到文件 hello.en 輸出文件名
使用私鑰解密:
openssl rsautl -decrypt -in hello.en -inkey rsa_private_key.pem -out hello.de
參數: -decrypt 解密 -in 從文件輸入 hello.en 上一步生成的加密文件 -inkey 輸入的密鑰 rsa_private_key.pem 上一步生成的私鑰 -out輸出到文件 hello.de 輸出的文件名
php加解密:
$profile="taoshihan"; echo "加密前:{$profile}\n"; //公鑰加密 $public_key=file_get_contents("rsa_public_key.pem"); $pub_key = openssl_pkey_get_public($public_key); openssl_public_encrypt($profile,$encrypted,$pub_key); $encrypted=base64_encode($encrypted);//因為加密后是亂碼,所以base64一下 echo "加密后:\n"; echo $encrypted."\n"; //私鑰解密 $private_key=file_get_contents("rsa_private_key.pem"); $pi_key = openssl_pkey_get_private($private_key); openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key); echo "解密后:\n"; echo $decrypted."\n";
firebase/php-jwt生成JWT:
生成: $jwt=JWT::encode($token,self::$privateKey,'RS256'); 解密: $token=JWT::decode($jwt,self::$publickKey, ['RS256']);
參數:$privateKey為私鑰;publickKey為公鑰
來源:https://www.cnblogs.com/hnhycnlc888/archive/2018/08/28/9551778.html
php-jwt::https://github.com/firebase/php-jwt
關於JWT:JSON Web Token 入門教程
https://github.com/firebase/php-jwt