news 2026/5/3 10:02:19

Java后端和前端的接口数据加密方案(椭圆曲线集成加密方案)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java后端和前端的接口数据加密方案(椭圆曲线集成加密方案)
1.解决问题

前后端在交互过程中,请求和响应的数据需要加密处理,并保证安全和性能。
方案名称:ECIES (Elliptic Curve Integrated Encryption Scheme,椭圆曲线集成加密方案)

2.核心思路
  1. 服务端准备
    • 生成密钥对(EC-椭圆曲线),私钥servPriKey放在服务端。
    • 公钥servPubKey安全地预置或下发给客户端(如通过初始化接口)。
  2. 客户端加密(每次请求)
    • 生成临时密钥对(EC-椭圆曲线),公钥pubKey私钥priKey
    • 计算共享密钥Key(ECDH-协商+sha256),用私钥priKey + 服务端公钥servPubKey
    • 加密请求业务数据(AES):encryptData = AES.encrypt(data, Key)
    • 发送加密后的业务数据encryptData公钥pubKey给服务端
  3. 服务端解密
    • 计算共享密钥Key(ECDH-协商+sha256),用私钥servPriKey + 客户端公钥pubKey
    • 解密请求数据,data = AES.decrypt(encryptData, Key)
  4. 服务端加密
    • 通过3中计算的Key直接加密数据即可
  5. 客户端解密
    • 通过2中计算的Key直接解密数据即可
3.代码示例
packagecom.visy.utils;importcn.hutool.crypto.symmetric.AES;importjavax.crypto.KeyAgreement;importjava.security.*;importjava.security.spec.ECGenParameterSpec;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.util.Base64;importjava.util.function.BiConsumer;importjava.util.function.Consumer;/** * ECIES (Elliptic Curve Integrated Encryption Scheme,椭圆曲线集成加密方案) * 这个方案是椭圆曲线密码学中的密码学方案,用于实现前后端间通信的数据加密,是应用内的加密机制。 * 核心是密钥协商:使用ECDH算法生成密钥对,并计算出共享密钥。 */publicclassECIESDemo{//Base64工具类staticclassBASE64{publicstaticStringencode(byte[]data){returnBase64.getEncoder().encodeToString(data);}publicstaticbyte[]decode(Stringbase64Str){returnBase64.getDecoder().decode(base64Str);}}//ECDH工具staticclassECDH{publicstaticStrKeyPairgenerateKeyPair(StringcurveName)throwsException{// 1. 指定椭圆曲线参数,例如 secp256r1 (NIST P-256)ECGenParameterSpececSpec=newECGenParameterSpec(curveName);// 2. 生成ECC密钥对KeyPairGeneratorkpg=KeyPairGenerator.getInstance("EC");kpg.initialize(ecSpec,newSecureRandom());KeyPairkeyPair=kpg.generateKeyPair();returnStrKeyPair.of(keyPair);}/** * ECDH核心方法:计算共享秘密 * @param myPriKey 己方的私钥(Base64字符串) * @param otherPubKey 对方的公钥(Base64字符串) * @return Base64编码的共享秘密字符串 */publicstaticStringderiveSharedSecret(StringmyPriKey,StringotherPubKey)throwsException{PrivateKey_myPriKey=privateKeyFromBase64(myPriKey);PublicKey_otherPubKey=publicKeyFromBase64(otherPubKey);KeyAgreementka=KeyAgreement.getInstance("ECDH");ka.init(_myPriKey);ka.doPhase(_otherPubKey,true);byte[]rawSecret=ka.generateSecret();//用SHA-256哈希一次,得到32字节AES-256密钥MessageDigestsha256=MessageDigest.getInstance("SHA-256");StringshearedSecret=BASE64.encode(sha256.digest(rawSecret));System.out.println("【共享密钥】计算-私钥:"+myPriKey);System.out.println("【共享密钥】计算-公钥:"+otherPubKey);System.out.println("【共享密钥】计算-结果:"+shearedSecret);System.out.println("---------------------------------");returnshearedSecret;}privatestaticPublicKeypublicKeyFromBase64(StringpublicKeyBase64)throwsException{byte[]decodedBytes=BASE64.decode(publicKeyBase64);KeyFactorykeyFactory=KeyFactory.getInstance("EC");X509EncodedKeySpeckeySpec=newX509EncodedKeySpec(decodedBytes);returnkeyFactory.generatePublic(keySpec);}privatestaticPrivateKeyprivateKeyFromBase64(StringprivateKeyBase64)throwsException{byte[]decodedBytes=BASE64.decode(privateKeyBase64);KeyFactorykeyFactory=KeyFactory.getInstance("EC");PKCS8EncodedKeySpeckeySpec=newPKCS8EncodedKeySpec(decodedBytes);returnkeyFactory.generatePrivate(keySpec);}}//AES加解密工具staticclassAes{publicstaticStringencrypt(Stringdata,Stringkey){AESaes=newAES(BASE64.decode(key));returnaes.encryptBase64(data);}publicstaticStringdecrypt(Stringdata,Stringkey){AESaes=newAES(BASE64.decode(key));returnaes.decryptStr(BASE64.decode(data));}}//模拟客户端(如浏览器)staticclassClient{//服务端公钥,固定值,后续不再更新privatefinalStringservPubKey;publicClient(StringservPubKey){this.servPubKey=servPubKey;System.out.println("【客户端】初始化完成,服务端公钥: "+servPubKey);System.out.println("---------------------------------");}publicvoidrequest(Serverserver,Stringmessage,BiConsumer<String,String>callback)throwsException{//生成密钥对StrKeyPairkeyPair=genKeyPair();//计算共享密钥StringsharedSecret=getSharedSecret(keyPair.getPriKey());//对称加密数据StringreqData=Aes.encrypt(message,sharedSecret);//封装传输通道Channelchannel=newChannel(keyPair.getPubKey(),reqData,resData->{callback.accept(resData,sharedSecret);//回调把请求的共享密钥带上,用于解密});//发送给服务端server.receive(channel);}privateStrKeyPairgenKeyPair()throwsException{StrKeyPairkeyPair=ECDH.generateKeyPair("secp256r1");System.out.println("【客户端】公钥: "+keyPair.getPubKey());System.out.println("【客户端】私钥: "+keyPair.getPriKey());System.out.println("【客户端】已刷新密钥对!");System.out.println("---------------------------------");returnkeyPair;}privateStringgetSharedSecret(StringpriKey)throwsException{returnECDH.deriveSharedSecret(priKey,this.servPubKey);}}//模拟后台服务端staticclassServer{//服务端密钥对,只生成一次privatefinalStrKeyPairkeyPair;publicServer()throwsException{this.keyPair=ECDH.generateKeyPair("secp256r1");System.out.println("【服务端】公钥: "+this.keyPair.getPubKey());System.out.println("【服务端】私钥: "+this.keyPair.getPriKey());System.out.println("【服务端】初始化完成!");System.out.println("---------------------------------");}publicStringgetPubKey(){returnthis.keyPair.getPubKey();}publicvoidreceive(Channelchannel)throwsException{//客户端公钥StringclientPubKey=channel.getClientPubKey();//计算共享密钥StringsharedSecret=getSharedSecret(clientPubKey);//解密数据Stringmessage=Aes.decrypt(channel.read(),sharedSecret);System.out.println("【服务端】收到消息: "+message);System.out.println("【服务端】客户端公钥:"+clientPubKey);System.out.println("---------------------------------");//响应消息StringresMsg="服务端已收到消息->"+message;//加密Stringdata=Aes.encrypt(resMsg,sharedSecret);//发送channel.write(data);}/** * 计算共享密钥(服务端私钥 + 客户端公钥) */privateStringgetSharedSecret(StringclientPubKey)throwsException{returnECDH.deriveSharedSecret(this.keyPair.getPriKey(),clientPubKey);}}//模拟请求通道staticclassChannel{privatefinalStringreqData;privatefinalStringclientPubKey;privatefinalConsumer<String>callback;publicChannel(StringclientPubKey,StringreqData,Consumer<String>callback){this.reqData=reqData;this.clientPubKey=clientPubKey;this.callback=callback;}//获取客户端公钥publicStringgetClientPubKey(){returnthis.clientPubKey;}//读取数据publicStringread(){returnthis.reqData;}//写入数据publicvoidwrite(StringresData){this.callback.accept(resData);}}//密钥对(base64字符串)staticclassStrKeyPair{privatefinalStringpriKey;privatefinalStringpubKey;privateStrKeyPair(KeyPairkeyPair){this.priKey=BASE64.encode(keyPair.getPrivate().getEncoded());this.pubKey=BASE64.encode(keyPair.getPublic().getEncoded());}publicstaticStrKeyPairof(KeyPairkeyPair){returnnewStrKeyPair(keyPair);}publicStringgetPriKey(){returnthis.priKey;}publicStringgetPubKey(){returnthis.pubKey;}}//测试publicstaticvoidmain(String[]args)throwsException{//创建服务端Serverserver=newServer();//创建客户端Clientclient=newClient(server.getPubKey());//向服务端发送请求client.request(server,"hello world",(resData,sharedSecret)->{//解密数据Stringmessage=Aes.decrypt(resData,sharedSecret);System.out.println("【客户端】收到消息: "+message);});System.out.println("============================================");//向服务端发送请求client.request(server,"{\"name\": \"张三\"}",(resData,sharedSecret)->{//解密数据Stringmessage=Aes.decrypt(resData,sharedSecret);System.out.println("【客户端】收到消息: "+message);});System.out.println("============================================");}}
4.输出
【服务端】公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUutqZsAN1Kh+FFvS95lKFob0zKZZY0mtBKNOYFSZ/WzaLO8CHH1zjcH3nV82MxXwyj0t+yhP/Dugfriy8VIWbg==【服务端】私钥:MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCAaJ/UnsK4Tt+1Vyt9vyAnYqinr8uobgPZOlvCMeihKkg==【服务端】初始化完成!---------------------------------【客户端】初始化完成,服务端公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUutqZsAN1Kh+FFvS95lKFob0zKZZY0mtBKNOYFSZ/WzaLO8CHH1zjcH3nV82MxXwyj0t+yhP/Dugfriy8VIWbg==---------------------------------【客户端】公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDz5YRdfRm1l0Wj0BqIBMEq2zLca96eidX/DEIZipQol8gzV4YKiLwtWxmS2rplAay1/4stiuofvLFZZAJ0rM/w==【客户端】私钥:MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCDLGtJ2Lxm+8cd+o1iDbxkigojjFdy+9k/wVhQ0XJTRQw==【客户端】已刷新密钥对!---------------------------------【共享密钥】计算-私钥:MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCDLGtJ2Lxm+8cd+o1iDbxkigojjFdy+9k/wVhQ0XJTRQw==【共享密钥】计算-公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUutqZsAN1Kh+FFvS95lKFob0zKZZY0mtBKNOYFSZ/WzaLO8CHH1zjcH3nV82MxXwyj0t+yhP/Dugfriy8VIWbg==【共享密钥】计算-结果:fIPyLCxiu26stP2C4bGyCU8Eh+uYUWp3w8PjRWdxh8k=---------------------------------【共享密钥】计算-私钥:MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCAaJ/UnsK4Tt+1Vyt9vyAnYqinr8uobgPZOlvCMeihKkg==【共享密钥】计算-公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDz5YRdfRm1l0Wj0BqIBMEq2zLca96eidX/DEIZipQol8gzV4YKiLwtWxmS2rplAay1/4stiuofvLFZZAJ0rM/w==【共享密钥】计算-结果:fIPyLCxiu26stP2C4bGyCU8Eh+uYUWp3w8PjRWdxh8k=---------------------------------【服务端】收到消息:hello world 【服务端】客户端公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDz5YRdfRm1l0Wj0BqIBMEq2zLca96eidX/DEIZipQol8gzV4YKiLwtWxmS2rplAay1/4stiuofvLFZZAJ0rM/w==---------------------------------【客户端】收到消息:服务端已收到消息->hello world============================================【客户端】公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGbyRS8JTE32TLAMXYaFpi8pY8Cf2R7u9gdta+PnB7thgyAZ5FEBGjgRhNEL2MFD7g5B8yLX3cTghpjisajs4Tw==【客户端】私钥:MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCADaXXP8AmBXXhrDJIXpFBH9byFr+ak38DAY1J1+zCktQ==【客户端】已刷新密钥对!---------------------------------【共享密钥】计算-私钥:MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCADaXXP8AmBXXhrDJIXpFBH9byFr+ak38DAY1J1+zCktQ==【共享密钥】计算-公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUutqZsAN1Kh+FFvS95lKFob0zKZZY0mtBKNOYFSZ/WzaLO8CHH1zjcH3nV82MxXwyj0t+yhP/Dugfriy8VIWbg==【共享密钥】计算-结果:7ngHo0nz8W2Zv9vMKORu5jC7uPIhgsZaS/657vCpcUs=---------------------------------【共享密钥】计算-私钥:MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCAaJ/UnsK4Tt+1Vyt9vyAnYqinr8uobgPZOlvCMeihKkg==【共享密钥】计算-公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGbyRS8JTE32TLAMXYaFpi8pY8Cf2R7u9gdta+PnB7thgyAZ5FEBGjgRhNEL2MFD7g5B8yLX3cTghpjisajs4Tw==【共享密钥】计算-结果:7ngHo0nz8W2Zv9vMKORu5jC7uPIhgsZaS/657vCpcUs=---------------------------------【服务端】收到消息:{"name":"张三"}【服务端】客户端公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGbyRS8JTE32TLAMXYaFpi8pY8Cf2R7u9gdta+PnB7thgyAZ5FEBGjgRhNEL2MFD7g5B8yLX3cTghpjisajs4Tw==---------------------------------【客户端】收到消息:服务端已收到消息->{"name":"张三"}============================================
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:47:22

BioSIM 抗人IL-31Ra抗体SIM0510:用于免疫细胞与皮肤组织表达分析

在免疫学与炎症研究领域&#xff0c;IL-31 受体 A&#xff08;IL-31Ra&#xff09;正逐渐成为科学家关注的焦点。作为 IL-31 的关键受体&#xff0c;IL-31Ra 在介导瘙痒、炎症等病理过程中发挥着重要作用。而BioSIM 抗人IL-31Ra抗体&#xff08;Nemolizumab 生物类似药&#xf…

作者头像 李华
网站建设 2026/5/1 2:27:52

“深数据” vs “大数据”

在数据驱动决策的时代&#xff0c;“大数据”早已成为高频热词&#xff0c;而“深数据”作为新兴概念&#xff0c;正逐渐走进行业视野。二者并非对立关系&#xff0c;却在核心逻辑、价值维度与应用场景上存在显著分野&#xff0c;共同构成了数据价值挖掘的两大重要方向。厘清二…

作者头像 李华
网站建设 2026/5/3 5:12:34

底部买入之神猎手副图/无未来数据 通达信买入公式

{}XA_1:REF(LLV(LOW,250/12),2); XA_2:MA(CLOSE,20); XA_3:MA(SLOPE(CLOSE,20)*5CLOSE,10); XA_4:LOW>XA_3 AND LOW<XA_2; XA_5:CROSS(MA(CLOSE,10),MA(CLOSE,5)); XA_6:COUNT(XA_5,5)>1; 神猎手:CROSS(CLOSE,XA_1) AND XA_4 AND XA_6,NODRAW; DRAWTEXT_FIX(ISLASTBAR…

作者头像 李华
网站建设 2026/5/1 13:23:49

五指买卖 通达信买卖指标 源码

{}能量线:EMA(100*(C-LLV(L,34))/(HHV(H,34)-LLV(L,34)),3),LINETHICK0; RSI:SMA(MAX(CLOSE-REF(CLOSE,1),0),6,1)/SMA(ABS(CLOSE-REF(CLOSE,1)),6,1)*100,LINETHICK0; RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100,LINETHICK0; K:SMA(RSV,3,1); D:SMA(K,3,1); {} J:3…

作者头像 李华
网站建设 2026/5/1 17:51:44

HTML模板引擎集成:Miniconda-Python3.10使用Jinja2生成网页

HTML模板引擎集成&#xff1a;Miniconda-Python3.10使用Jinja2生成网页 在数据密集型项目日益普及的今天&#xff0c;手动维护大量HTML页面早已成为开发者的噩梦。想象一下&#xff1a;一个AI实验团队每天产出数十组模型指标和可视化图表&#xff0c;却要靠人工复制粘贴到报告中…

作者头像 李华
网站建设 2026/5/1 10:29:39

小白也能学会的PyTorch安装教程GPU版本(基于Miniconda-Python3.10)

基于 Miniconda 的 PyTorch GPU 环境搭建&#xff1a;从零开始的高效实践 你有没有遇到过这种情况&#xff1a;兴冲冲地准备复现一篇论文&#xff0c;结果刚运行 import torch 就发现 GPU 不可用&#xff1f;或者明明装了 CUDA&#xff0c;torch.cuda.is_available() 却返回 Fa…

作者头像 李华