遇到這個問題怎么辦

1. 問題現象

話說近日博主的團隊中,有一個小盆友遇到了一個問題,即使用RSA進行加解密的時候,拋異常了:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=118, too big.at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:205)at java.security.KeyFactory.generatePublic(KeyFactory.java:334)at com.dfwy.common.core.utils.sign.SignHelper.main(SignHelper.java:205)
Caused by: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=118, too big.at sun.security.x509.X509Key.decode(X509Key.java:398)at sun.security.x509.X509Key.decode(X509Key.java:403)at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:86)at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:298)at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)... 2 more

博主眨眼一看,xx too big,難道是content太長了? 顯然不像,于是盤問了幾句。

2. 解決過程

在盤問過程中,原來是在使用對方提供的證書過程中,出現了問題。

我們使用RSA公鑰加密的時候,通常需要對方提供證書(公鑰)。沒有公鑰,我們無法完成加、解密。博主正好有一篇博文,可以參考,回看請速戳:微服務實戰系列之加密RSA。

我們在使用公鑰解密時,對方提供的一般是公鑰證書(文件格式不一,與支持的web容器有關),博主以PEM文件為例(Nginx一般使用pem)。

PEM文件其實是把文件的編碼從DER轉碼為base64字符格式。因此在實際使用時,需要把它逆向轉回DER編碼,再轉為java.security.PublicKey。接著我們可以愉快的獲取到公鑰進行加密操作了。

//獲取pubKey ,參考代碼
String pKey = "efa9c1223g5eced71940ff4029a7baa5ccc7e66021a03ss5ff29cb84c";
byte[] keyBytes = Base64.decode(pKey);
X509EncodedKeySpec x509 = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(x509 );
3. 總結經驗

所以我們在使用RSA加解密時,如遇到諸如xx too big的問題,可以從以下思路展開:

  1. 配置問題
    比如我們通常使用springboot構建微服務,那是不是相關證書已支持等等,請檢查。

  2. 證書文件問題
    比如對方提供的證書文件是否正確、有效。如證書不對,其他皆枉然。RSA公鑰和私鑰是天生一對,誰也離不開誰。如其中一個出了問題,另外一個必然可以“六親不認”

  3. 代碼
    是否根據證書格式進行相應的編碼轉換,轉換是否正確等等,請檢查。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210165.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210165.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210165.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高防CDN:在保障服務器與網站成本的角度的智慧選擇

隨著網絡攻擊的不斷升級和演變&#xff0c;保障服務器與網站安全成為了企業不可忽視的重要問題。高防CDN&#xff08;內容分發網絡&#xff09;技術應運而生&#xff0c;為服務器與網站的穩定運行提供了全面而有效的保護。本文將從服務器與網站成本的角度深入分析高防CDN在降低…

【Python】Faker庫詳解:創建測試數據輕而易舉

Python Faker庫詳解&#xff1a;創建測試數據輕而易舉 在軟件開發和測試過程中&#xff0c;通常需要大量的測試數據來模擬真實環境。Python的Faker庫為開發者提供了一個方便、靈活且強大的工具&#xff0c;用于生成各種虛構數據。本文將深入介紹Faker庫&#xff0c;演示其基本…

十一、了解分布式計算

1、什么是&#xff08;數據&#xff09;計算&#xff1f; 2、分布式(數據)計算 &#xff08;1&#xff09;概念 顧名思義&#xff0c;分布式計算&#xff0c;即以分布式的形式完成數據的統計&#xff0c;得到需要的結果。 分布式數據計算&#xff0c;顧名思義&#xff0c;就是…

c語言選擇排序總結(詳解)

選擇排序cpp文件項目結構截圖 項目cpp文件截圖 項目具體代碼截圖 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <string.h> #include <time.h> #include &…

Java發展史

Java發展史 Java歷史的幾個重要節點&#xff1a; 1990&#xff0c;Sun公司啟動了一個名為“綠色計劃”的項目&#xff0c;由James Gosling等領導&#xff0c;目標是開發一種可以在機頂盒等消費性電子產品上運行的程序架構。這個計劃產生了Java的前身&#xff1a;Oak&#xff…

Java八股文面試全套真題【含答案】-XML篇

XML 是什么&#xff1f;它的全稱是什么&#xff1f; 答案&#xff1a;XML&#xff08;可擴展標記語言&#xff09;是一種用于描述數據的標記語言&#xff0c;用于存儲和交換結構化的信息。XML 的全稱是 eXtensible Markup Language。XML 和 HTML 有什么區別&#xff1f; 答案&a…

看圖學源碼 之 ConcurrentHashMap put、get、remove、clear、擴容等相關方法的源碼分析

ConcurrentHashMap 引入 HashMap 的弊端 多線程下是不安全的&#xff0c;是有死循環的 JDK1.7 的時候會使用頭插法將新的節點增加到頭部&#xff0c;那么就會造成鏈表翻轉成為了閉環&#xff0c;就是所謂的死循環。 JDK1.8之后使用的是尾插法&#xff0c;因此不會造成環形鏈…

京東數據運營:京東API接口有哪些?京東數據如何采集調用?

市場分析對于電商品牌來說非常重要&#xff0c;它可以幫助電商品牌更好地理解市場&#xff0c;把握市場機會&#xff0c;以及制定有效的產品定價、產品營銷策略等等。 結合市場中可以幫助品牌方做市場分析的電商數據分析工具——鯨參謀電商數據分析平臺&#xff0c;我們一起具體…

在Mac上安裝Windows應用程序的簡便方法:CrossOver for Mac

對于許多Mac用戶來說&#xff0c;有時候他們可能需要使用一些只有在Windows上才能找到的應用程序。以前&#xff0c;解決這個問題的方法是通過安裝Windows虛擬機或使用雙系統來在Mac上運行Windows應用程序。但這些方法需要額外的硬件資源和時間來配置&#xff0c;并且可能會導致…

IOT安全學習路標

1. 物聯網基礎知識 首先&#xff0c;你需要建立堅實的物聯網基礎知識&#xff0c;包括IoT的架構和組件&#xff0c;傳感器和設備的連接和通信技術&#xff0c;云端和邊緣計算等。 2. 通信和網絡安全 學習關于物聯網通信和網絡安全的基礎知識&#xff0c;包括加密和認證技術、…

通俗解釋一下“強靜態類型”

我寫軟件已經有 20 多年了&#xff0c;隨著時間的推移&#xff0c;我越來越確信強靜態類型不僅是一個好主意&#xff0c;而且幾乎總是正確的選擇。 非類型化語言(或語言變體)肯定有用途&#xff0c;例如&#xff0c;當使用 REPL 時&#xff0c;或者在已經無可救藥的無類型環境(…

有什么進銷存軟件能對接微信小程序?

有什么進銷存軟件能對接微信小程序&#xff1f; 據我所知&#xff0c;很多進銷存軟件都有配套的微信小程序吧。 以我們現在用的這個為例&#xff0c;這也是同行推薦過來的&#xff0c;很好用&#xff0c;而且性價比很高—— 在線平臺&#xff0c;無需下載APP&#xff0c;搭載…

C語言實戰演練之跳動的愛心C語言版

跳 動 的 愛 心 - LOVE - 完整程序 #include <stdio.h> #include <math.h> #include <windows.h> #include <tchar.h> float f(float x, float y, float z) {float a x * x 9.0f / 4.0f * y * y z * z - 1;return a * a * a - x * x * z * z …

ELK簡單介紹一

任務背景 運維人員需要對系統和業務日志進行精準把控&#xff0c;便于分析系統和業務狀態。日志分布在不同的服務器上&#xff0c;傳統的使用傳統的方法依次登錄每臺服務器查看日志&#xff0c;既繁瑣又效率低下。所以我們需要集中化的日志管理工具將位于不同服務器上的日志收…

藍橋杯日期問題

藍橋杯其他真題點這里&#x1f448; 注意日期合法的判斷 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main{static int[] days {0,31,28,31,30,31,30,31,31,30,31,30,31};static BufferedReader in new Buf…

【核心重點】Flink四大基石

1. Time&#xff08;時間機制&#xff09; 時間概念 處理時間&#xff1a;執行具體操作時的機器時間&#xff08;例如 Java的 System.currentTimeMillis()) &#xff09;事件時間&#xff1a;數據本身攜帶的時間&#xff0c;事件產生時的時間。攝入時間&#xff1a;數據進入 …

linux vim 基礎設置-自動填充文件頭

前言 當前為vimrc腳本設置&#xff0c;腳本位置在 ~/.vimrc or /etc/vimrc 當前為首次打開 C C Shell 文件&#xff0c;自動填充對應文件頭信息&#xff0c;再次打開時會修改對應時間信息 :set nu "顯示行號 :set hlsearch "搜索時 高亮"新建 .c .cpp .sh文件&a…

理解Go語言中的defer

引言 Go有許多在其他編程語言中可以找到的常見控制流關鍵字,例如if、switch、for等。defer是其他大多數編程語言中沒有的關鍵字,盡管它不太常見,但你很快就會看到它在你的程序中有多么有用。 defer語句的主要用途之一是清理資源,例如打開的文件,網絡連接和數據庫句柄。在…

在AWS Lambda上部署EC2編譯的FFmpeg工具——自定義層的方案

大綱 1 確定Lambda運行時環境1.1 Lambda系統、鏡像、內核版本1.2 運行時1.2.1 Python1.2.2 Java 2 環境準備2.1 創建EC2實例 3 編譯FFmpeg3.1 連接EC2 4 編譯5 上傳S3存儲桶5.1 創建S3桶5.2 創建IAM策略5.3 創建IAM角色5.4 EC2關聯角色5.5 修改桶策略5.6 打包并上傳 6 創建Lamb…

智能優化算法應用:基于海鷗算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于海鷗算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于海鷗算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.海鷗算法4.實驗參數設定5.算法結果6.參考文獻7.MA…