


Simple implementation of Javascript to PHP encrypted communication
For most websites on the Internet, user data is submitted directly to the back-end CGI in clear text, and most accesses between servers are transmitted in clear text, which can be monitored by some people with ulterior motives through some means. Websites with higher security requirements, such as banks and large enterprises, will use HTTPS to encrypt the communication process.
But the cost of using HTTPS is extremely expensive. It’s not just the purchase of CA certificates, but more importantly, the serious performance bottleneck. The solution currently can only be to use specialized SSL hardware acceleration equipment such as F5’s BIGIP. Therefore, some websites choose to simply simulate SSL and use RSA and AES to encrypt the transmitted data. The principle is shown in the figure below:
# This improves the security of data transmission to a certain extent. But for most websites, most data does not need to be so strict, and only certain important small data can be selectively encrypted, such as passwords. For small data volume encryption, it is not necessary to use the entire process, just use RSA, which will greatly simplify the process.
Why is the amount of data small? Because compared to symmetric encryption, the asymmetric encryption algorithm will become extremely slow as the amount of data increases. Therefore, symmetric encryption algorithms are generally used for actual data encryption. Therefore, the openssl extended public and private key encryption functions in PHP only support small data (117 bytes for encryption and 128 bytes for decryption).
There are some open source Javascript algorithm libraries for AES and RSA on the Internet, which can be directly implemented in PHP through related extensions (the AES algorithm can be implemented through mcrypt related function, RSA can be implemented through the related functions of openssl), instead of using pure PHP code to implement the algorithm as mentioned on the Internet. Due to space limitations, this article only introduces the implementation of RSA encrypted communication between Javascript and PHP, taking password encryption as an example.
First code:
Front-end encryption
First load three RSA js library files, which can be downloaded here http://www.ohdave.com/rsa/
$(document).ready(function(){ //十六进制公钥 var rsa_n = "C34E069415AC02FC4EA5F45779B7568506713E9210789D527BB89EE462662A1D0E94285E1A764F111D553ADD7C65673161E69298A8BE2212DF8016787E2F4859CD599516880D79EE5130FC5F8B7F69476938557CD3B8A79A612F1DDACCADAA5B6953ECC4716091E7C5E9F045B28004D33548EC89ED5C6B2C64D6C3697C5B9DD3"; $("#submit").click(function(){ setMaxDigits(131); //131 => n的十六进制位数/2+3 var key = new RSAKeyPair("10001", '', rsa_n); //10001 => e的十六进制 var password = $("#password").val(); password = encryptedString(key, password);//美中不足,不支持汉字~ $("#password").val(password); $("#login").submit(); }); });
PHP encryption function
/** * 私钥解密 * * @param string 密文(base64编码) * @param string 密钥文件(.pem) * @param string 密文是否来源于JS的RSA加密 * @return string 明文 */ function privatekey_decodeing($crypttext, $fileName,$fromjs = FALSE) { $key_content = file_get_contents($fileName); $prikeyid = openssl_get_privatekey($key_content); $crypttext = base64_decode($crypttext); $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING; if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding)) { return $fromjs ? rtrim(strrev($sourcestr), "/0") : "".$sourcestr; } return FALSE; }
PHP decryption function
/** * 私钥解密 * * @param string 密文(base64编码) * @param string 密钥文件(.pem) * @param string 密文是否来源于JS的RSA加密 * @return string 明文 */ function privatekey_decodeing($crypttext, $fileName,$fromjs = FALSE) { $key_content = file_get_contents($fileName); $prikeyid = openssl_get_privatekey($key_content); $crypttext = base64_decode($crypttext); $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING; if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding)) { return $fromjs ? rtrim(strrev($sourcestr), "/0") : "".$sourcestr; } return FALSE; }
Test code
define("CRT", "ssl/server.crt"); //公钥文件 define("PEM", "ssl/server.pem"); //私钥文件 //JS->PHP 测试 $data = $_POST['password']; $txt_en = base64_encode(pack("H*", $data)); //转成base64格式 $txt_de = privatekey_decodeing($txt_en, PEM, TRUE); var_dump($txt_de); //PHP->PHP 测试 $data = "测试TEST"; //PHP端支持汉字:D $txt_en = publickey_encodeing($data, CRT); $txt_de = privatekey_decodeing($txt_en, PEM); var_dump($txt_de);
After the code is posted, There are a few things that need to be explained. Obtaining the hexadecimal public key is the key. Since the key is obtained from the x.509 certificate, you must first generate the key and certificate file (the 1024-bit key used in this article). Please Google for the specific generation method :P. Here we focus on how to get the hexadecimal key from it.
Read the hexadecimal key from the file. I have tried many methods before. It is said on the Internet that the data is encoded with ASN.1...囧~ Finally, I accidentally noticed that openssl under the linux shell looks like Can be extracted from private key file (key or pem).
openssl asn1parse -out temp.ans -i -inform PEM < server.pem
The display results are as follows:
From here you can finally see the ten required in Javascript Hexadecimal public key: D
The above is the detailed content of Simple implementation of Javascript to PHP encrypted communication. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.
