フロントエンド(JS)とバックエンド(PHP)はRSAで復号化を実現


プロジェクト開発の過程では、セキュリティ上の理由で機密情報を明文で伝達することができず、キャプチャされやすいため、RSAを導入する.
1.公開鍵と秘密鍵の生成
  • は、端末(Unixベースのオペレーティングシステム)に以下の内容を入力する.秘密鍵
  • を生成する.
    openssl genrsa -out rsa_1024_priv.pem 1024
    
  • は、以下のコマンドを実行することにより、公開鍵
  • を取得する.
    openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem
    
  • は、catコマンドを使用して
  • を表示することができる.
    cat rsa_1024_priv.pem         //    
    cat rsa_1024_pub.pem          //    
    
  • フロントエンドコード:
  • <script src="http://code.jquery.com/jquery-1.8.3.min.js">script>
    <script src="bin/jsencrypt.min.js">script>
    <script type="text/javascript">
    $(function () {
        //      ,              
        var data = 'date';
    
        //  ,           
        var pub_key = '-----BEGIN PUBLIC KEY-----
    '
    + 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFUEBi3D1Q8yFco32wWI/se4lA
    '
    + 'ftsCNi71rgkLNsOhIR3ZOGywKsKjoZ7pewG6PDvISEodkZxVDlV401VP8sIPFP1d
    '
    + 'fwdNEZQRHugDiuLIVRdkGWh0loviWWFJuzvJuOFxxyv9IyLt2Whvvoy3y8T9Hntl
    '
    + 'tgmIbwW9wMA8U1XP9wIDAQAB
    '
    + '-----END PUBLIC KEY-----'; // , var private_key = '-----BEGIN RSA PRIVATE KEY-----
    '
    + 'MIICXgIBAAKBgQDFUEBi3D1Q8yFco32wWI/se4lAftsCNi71rgkLNsOhIR3ZOGyw
    '
    + 'KsKjoZ7pewG6PDvISEodkZxVDlV401VP8sIPFP1dfwdNEZQRHugDiuLIVRdkGWh0
    '
    + 'loviWWFJuzvJuOFxxyv9IyLt2Whvvoy3y8T9HntltgmIbwW9wMA8U1XP9wIDAQAB
    '
    + 'AoGBALoZOuEDQIG9DtZFDSLqJLSyv30pKH8pg5kMkFMXT+QFTBW4diqh6fpTUYJ9
    '
    + 'FeAFN41rQRwqXfyLDGptSKWjHQtcBDzpYil+CrFnFFIzADgUtzfKVnfMwgO3X5yx
    '
    + 'j+akB9Pm+er1F9t2qh7OwpbiWXo2ThF5Sfn7PjvdVswmOhsBAkEA7MecQO+PIGzr
    '
    + 'wwwRLadSyT+fIt8dYxdrZ+Hjc+ff9uo3gAM/IBj08fIHLHf8WOaEwz3G0l944xbm
    '
    + 'GtcqO9XllwJBANVUg8ZOIkzY0o2EmoP8zxmjIs4WsUrF2msp7vI9kHLeIUBLCwyv
    '
    + 'fAh0x2SRQTfbr0ZZb7593VyvUGbuP/F4dKECQQCHmZkmpwr0quwp+5Mq7hQ/JKxi
    '
    + 'MByITzU3fOnhyv08Ts4SBcn0+9XraYwqL1zZHMsTdSGUAREeHFMTM/3/3nNpAkAl
    '
    + 'jeA4u658GrtOIGbXD10h5T8OSp5hTF07+kDPMhlIr2PpHozOaeIK1wv23z885xZ+
    '
    + '6uWqAhxC4bXkuNJW3t6hAkEApKMMfLafxv3S8u8ilRku8JSegPLY325GB2vWHC8H
    '
    + 'jY+Hv3qF9xcP5cbj43KPF0wWhKCECVSvPaMiwUbJzgu9JQ==
    '
    + '-----END RSA PRIVATE KEY-----'; //new JSEncrypt var js_encrypt = new JSEncrypt();// jsencrypt.mim.js , // : , , // js_encrypt.setPublicKey(pub_key); // js_encrypt.setPrivateKey(private_key); // var encrypted = js_encrypt.encrypt(data); console.log(encrypted); // var uncrypted = js_encrypt.decrypt(encrypted); console.log(uncrypted); });
    script>
  • バックエンドコード
  • class Encrypt
    {
    	//     
        const PUBKEY= '-----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFUEBi3D1Q8yFco32wWI/se4lA
    ftsCNi71rgkLNsOhIR3ZOGywKsKjoZ7pewG6PDvISEodkZxVDlV401VP8sIPFP1d
    fwdNEZQRHugDiuLIVRdkGWh0loviWWFJuzvJuOFxxyv9IyLt2Whvvoy3y8T9Hntl
    tgmIbwW9wMA8U1XP9wIDAQAB
    -----END PUBLIC KEY-----';
    
        const PRIVATEKEY = '-----BEGIN RSA PRIVATE KEY-----
    MIICXgIBAAKBgQDFUEBi3D1Q8yFco32wWI/se4lAftsCNi71rgkLNsOhIR3ZOGyw
    KsKjoZ7pewG6PDvISEodkZxVDlV401VP8sIPFP1dfwdNEZQRHugDiuLIVRdkGWh0
    loviWWFJuzvJuOFxxyv9IyLt2Whvvoy3y8T9HntltgmIbwW9wMA8U1XP9wIDAQAB
    AoGBALoZOuEDQIG9DtZFDSLqJLSyv30pKH8pg5kMkFMXT+QFTBW4diqh6fpTUYJ9
    FeAFN41rQRwqXfyLDGptSKWjHQtcBDzpYil+CrFnFFIzADgUtzfKVnfMwgO3X5yx
    j+akB9Pm+er1F9t2qh7OwpbiWXo2ThF5Sfn7PjvdVswmOhsBAkEA7MecQO+PIGzr
    wwwRLadSyT+fIt8dYxdrZ+Hjc+ff9uo3gAM/IBj08fIHLHf8WOaEwz3G0l944xbm
    GtcqO9XllwJBANVUg8ZOIkzY0o2EmoP8zxmjIs4WsUrF2msp7vI9kHLeIUBLCwyv
    fAh0x2SRQTfbr0ZZb7593VyvUGbuP/F4dKECQQCHmZkmpwr0quwp+5Mq7hQ/JKxi
    MByITzU3fOnhyv08Ts4SBcn0+9XraYwqL1zZHMsTdSGUAREeHFMTM/3/3nNpAkAl
    jeA4u658GrtOIGbXD10h5T8OSp5hTF07+kDPMhlIr2PpHozOaeIK1wv23z885xZ+
    6uWqAhxC4bXkuNJW3t6hAkEApKMMfLafxv3S8u8ilRku8JSegPLY325GB2vWHC8H
    jY+Hv3qF9xcP5cbj43KPF0wWhKCECVSvPaMiwUbJzgu9JQ==
    -----END RSA PRIVATE KEY-----';
    
        /**
         *   
         * @param string $encryptString
         * @return bool|string
         */
        public static function privateDecrypt($encryptString = '')
        {
            $decrypted  = '';
            openssl_private_decrypt(base64_decode($encryptString), $decrypted, self::PRIVATEKEY);
            return $decrypted;
        }
    
        /**
         *   
         * @param string $data
         * @return bool|string
         */
        public static function publicEncrypt($data = '')
        {
            $encrypt_data = '';
            openssl_public_encrypt($data, $encrypt_data, self::PUBKEY);
            $encrypt_data = base64_encode($encrypt_data);
            return $encrypt_data;
        }
    }
    
  • はその後、それに基づいて自分のニーズに応じて関連機能を実現する.Githubアドレス:jsencrypt.min.js