js、php、java使用非对称加密(RSA)进行加密通讯

js、php、java使用非对称加密(RSA)进行加密通讯

js、php、java使用非对称加密(RSA)进行加密通讯

RSA加密算法是一种非对称加密算法。在电商、银行等交易系统里使用广泛,今天我们演示通过js、java、php来实现浏览器端公钥加密,服务端(java、php)私钥解密的单向非对称加密过程。

js、php、java使用非对称加密(RSA)进行加密通讯

前提工作

linux下利用openssl生成证书

1、在linux服务器下执行一下命令产生一个私钥文件

openssl genrsa -out rsa_1024_priv.pem 1024

你可以用一下命令查看私钥内容,复制出来,待会要用到

cat rsa_1024_priv.pem

2、利用私钥产生公钥文件,在命令行中继续执行一下命令

openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem

执行以下命令,打开公钥文件,复制出来,待会要用到

cat rsa_1024_pub.pem

前端

前端js主要利用jsencrypt库使用刚刚生成的公钥对数据进行加密,将加密后的数据传到后端(java或php)

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>BFW NEW PAGE</title>
    <script id="bfwone" data="dep=jquery.17&err=0" type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/bfwone.js"></script>
    <script type="text/javascript">
        bready(function() {
            use(["jsencrypt"], function() {
                var encrypt = new JSEncrypt();
                encrypt.setPublicKey('刚刚生成的公钥文件内容');
                var encrypted = encrypt.encrypt('加密的字符串');//利用ajax传回后端
            });
        });
    </script>
</head>
<body>
    
</body>
</html>

后端

JAVA

    /**
     * RSA私钥解密
     *
     * @param str        加密字符串
     * @param privateKey 私钥
     * @return 明文
     * @throws Exception 解密过程中的异常信息
     */
    public static String decrypt(String str, String privateKey) throws Exception {
        //64位解码加密后的字符串
        byte[] inputByte = Base64.getDecoder().decode(str);
        //base64编码的私钥
        byte[] decoded = Base64.getDecoder().decode(privateKey);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
        //RSA解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        String outStr = new String(cipher.doFinal(inputByte));
        return outStr;
    }


PHP

//私钥解密
function decrypt($data){
            if (!$data) {
                return false;
            }
            if(!openssl_private_decrypt(base64_decode($data), $decrypt_data, "刚刚生成的私钥文件内容")) {
                return false;
            }
            return $decrypt_data;
}

ok,整个Rsa加密通讯过程就完成了


{{collectdata}}

网友评论0