http请求数据加密

在开发应用的过程中,难免会遇到隐私数据的传输,如账号密码、支付密码等。以明文的方式传输这些信息,会有泄露给别人的风险。

http都是以明文传输,数据都是未经加密的。https的数据传输过程是加密的,传输过程中即使被别人截取,也不会造成很大的影响。对于安全性而言,上https能够解决大部分问题,但发送请求时在浏览器控制台中,依然能看到详细的请求数据:

某不知名博客登录请求

如果不希望控制台中能够看到请求数据信息,那么必须在发送请求之前将数据进行加密:

某乎登录请求

实现方法

前置准备:

  1. 一对匹配的公钥私钥
  2. jsencrypt(rsa加密库)

前端部分实现:

// 公钥
const publicKey = `-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCh5Nk2GLiyQFMIU+h3OEA4UeFbu3dCH5sjd/sLTxxvwjXq7JLqJbt2rCIdzpAXOi4jL+FRGQnHaxUlHUBZsojnCcHvhrz2knV6rXNogt0emL7f7ZMRo8IsQGV8mlKIC9xLnlOQQdRNUssmrROrCG99wpTRRNZjOmLvkcoXdeuaCQIDAQAB-----END PUBLIC KEY-----`

// 创建实例并设置公钥
const encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey)

// 设置请求数据
const data = {
  email: '[email protected]',
  password: 'testpwd'
}

// 加密请求数据
const encrypted = encryptor.encrypt(
  JSON.stringify(data)
)

// 打印服务器解密结果
const http = new XMLHttpRequest()
http.open('post', './server.php')
http.responseType = 'json'
http.send(encrypted)
http.onload = () => {
  console.log(http.response)
}

后端部分实现:

<?php

// 私钥
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCh5Nk2GLiyQFMIU+h3OEA4UeFbu3dCH5sjd/sLTxxvwjXq7JLq
Jbt2rCIdzpAXOi4jL+FRGQnHaxUlHUBZsojnCcHvhrz2knV6rXNogt0emL7f7ZMR
o8IsQGV8mlKIC9xLnlOQQdRNUssmrROrCG99wpTRRNZjOmLvkcoXdeuaCQIDAQAB
AoGAUTcJ1H6QYTOts9bMHsrERLymzir8R9qtLBzrfp/gRxxpigHGLdph8cWmk8dl
N5HDRXmmkdV6t2S7xdOnzZen31lcWe0bIzg0SrFiUEOtg3Lwxzw2Pz0dKwg4ZUoo
GKpcIU6kEpbC2UkjBV4+2E6P1DXuhdgTyHoUA3ycxOdjCAUCQQCyjTzGPXFoHq5T
miJyVd4VXNyCXGU0ZuQayt6nPN8Gd5CcEb2S4kggzPXQcd90FO0kHfZV6+PGTrc2
ZUuz5uwPAkEA6B3lmEmiZsJS/decLzWR0T1CXaFGwTjBQbHXJ0RziAfkuy+VwSmh
vrW/ipk5xbREr5rKx3jVI2PzVOvLw7NgZwJAbUsvDFnH9WfyZZJPy5TsID97awCL
oovozM2phM0p55eAmUfyttp0ND/BqBpMIY49qoH8q5N9FYJRe6Z9tF2B2QJAQBEo
cw039xcB4zCk2l713YQEEmXWarSomuJkWWFKZiyPlJ8Ava0pCMOPl8jNKmWkY7fc
6ovOgJMw8aqXtm+HVwJAerJeUEDez2djG5pIF6aCV0bP3fhQUq8OQCgGF5Qzo9Cn
qvYreGpYKPJGVixAsEPCiLzJRhy1XfFona6VRXIIxw==
-----END RSA PRIVATE KEY-----';

// 加密后的请求数据
$request = file_get_contents('php://input');

// jsencrypt会默认将加密后的数据转为base64字符串
$encrypted = base64_decode($request);

// 解密密文并返回给前端
openssl_private_decrypt($encrypted, $decrypted, $private_key);
echo $decrypted;

实现效果:

加密后的请求数据
解密后的请求数据

(成功水过一个月…

加入对话

2条评论

  1. 今天,我已经上网冲浪了七个多小时,但从未找到像您这样有趣的文章。对我来说,这足够值得。就个人而言,如果所有站点所有者和博客作者都像您一样做得很好,那么互联网将比遗忘任何时候都更加有用。

    1. 嗨,亲爱的Chutz,十分感谢你的评论,希望你能在这里发现有用的资料。

留下评论

邮箱地址不会被公开。 必填项已用*标注

给博主打赏

2元 5元 10元