1. Springboot之介面簡單加密和驗證
跟第三方系統打交道時一般會雙方協商一組秘鑰,然後將介面的參搭埋豎數進行約定的處理,防止介面被盜刷。
通用參數,在header上加入兩個參數,參數知大信息如下:
同一組參數只在液族10s內有效,考慮到伺服器和客戶端時間差,前後5秒有效。
入口函數
倆個驗證函數
2. 【參數加密】前後端分離請求參數加密與響應結果加密處理
編輯更改過濾器的注冊
因注冊到spring security 組件上無法攔截ignoing 的請求,更改為spring boot 方式注冊,注意點為order 排序的設置,響應最簡單設置為最大就好。關鍵點是請求filter的位置非常重要。這里要放在 spring security 內置過濾器前,spring CorsFilter 之後,此處多次測試猜的數為-100,暫未找到更科學方法。
JsonUtils 工具類
java結束
上訴把程序以及思路提供,可以根據自己需要的加密解密方式進行處理,以下兩種方式我進行了嘗試最終選擇了第二種。
3. SpringBoot 請求消息體解密(通信加密解密)
在一些安全性要求較高的項目中,我們希望客戶端請求數據可以做到數據加密,伺服器端進行解密。(單純的HTTPS仍難以滿足安全需要。)
本文基於SpringBoot針對消息體進行解密,目前僅支持請求消息解密。(響應消息過大情況下,加密會帶來嚴重的性能問題。)
流程如下:
使用DES cbc模式對稱加密請求體。要求客戶端請求前加對消息體進行加密,伺服器端通過SpringMVC Advice攔截請求解密後,傳給controller的方法。
@ControllerAdvice註解可以掃描針對Controller層的擴展組件。通過@Sort註解可以使其支持順序載入。
RequestBodyAdviceAdapter是RequestBodyAdvice適配器類,可以方便的擴展所需要的方法。
RequestBodyAdvice功能如下:
允許在請求消息體在被讀取及調用convert轉換成實體之前做一些個人化操作,作用於含有@RequestBody註解的請求。實現此介面的類,需要在RequestMappingHandlerAdapter中配置或通過@ControllerAdvice註解配置。
原文如下:
使用以下註解即可快速開啟全部請求的伺服器端消息體解密功能。
使用scan-annotation可開啟註解所標注的Conrtoller的類或其方法的解密功能。將要解密的方法或類上添加@SecretBody註解。並開啟以下配置:
可以使用annotation-class配置自己的自定義註解:
作用於整個類:
作用於方法:
默認密鑰如下,可以自行修改
前端調用時,需先將要請求的消息體通過DEScbc模式加密消息體(如json字元串)後傳輸。一般在http工具的請求攔截器中進行處理。如為json,仍然需要指定content-type為application/json。
postman請求示例如下:
4. springboot feignclient調用服務請求參數加密
spring boot配置(1) 作者同類文章X <dependency> <groupId>org.springframework...如調用網路的一個api @FeignClient(url = "${map.url}",name
5. springboot上傳文件到伺服器aes加密
業務需求:資料庫中的用戶名密碼明文存儲在配置文件中,不是十分安全。所以將資料庫中的用戶名密碼使用AES對稱加密放入配置文件中,達到加密效果。同時也不想使用tomcat等中間件等太繁重,就使用了spring boot 輕量級框架。個人比較菜,輕噴。
關於如何搭建spring boot項目其他的人說的很詳細 參考初識Spring Boot框架
入口類代碼
@Controller
@SpringBootApplication
@EnableAutoConfiguration
{
publicstaticvoidmain(String[]args){
SpringApplication.run(Aesdemo1Application.class,args);
}
}
運行時只要運行main方法 或者打包後java -jar 即可(寫成.bat文件 點擊運行方便簡單)
@Controller
publicclassGetKeyController{
@GetMapping("/getkey")
publicStringgreetingForm(Modelmodel){
model.addAttribute("passwordBean",newPasswordBean());return"index";
}
@PostMapping("/getkey")
publicStringgreetingSubmit(@){
Strings1=AESUtil.encrypt(passwordBean.getPassword(),passwordBean.getVar1());
passwordBean.setVar2(s1);
return"result";
}
}
啟動後有這里還有一個控制器類
瀏覽器地址輸入 http://localhost:8080/getkey 即可跳轉到greetingForm 方法,賦入PasswordBean屬性後 跳轉到index.html
PasswordBean 是自己定義的bean類 裡面有password var1 var2 3個屬性
index.html代碼
<!DOCTYPEhtml>
<htmllang="en"xmlns:th="http://www.thymeleaf.org">
<head>
<metacharset="UTF-8"/>
<title>Title</title>
</head>
<body>
<formaction="#"th:action="@{/getkey}"th:object="${passwordBean}"method="post">
<p>密碼:<inputtype="text"th:field="*{password}"/></p>
<p>加密字元:<inputtype="text"th:field="*{var1}"/></p>
<p><inputtype="submit"value="Submit"/>
<inputtype="reset"value="Reset"/></p>
</form>
</body>
</html>
注意使用了thymeleaf框架 所以必須引入
輸入要加密的和鹽即可獲得通過post方法到result即可獲得加密後字元串
<!DOCTYPEhtml>
<htmllang="en"xmlns:th="http://www.thymeleaf.org">
<head>
<metacharset="UTF-8"/>
<title>Title</title>
</head>
<body>
<h1>Result</h1>
<pth:text="'密碼:'+${passwordBean.password}"/>
<pth:text="'加密字元:'+${passwordBean.var1}"/>
<pth:text="'加密後字元:'+${passwordBean.var2}"/>
<ahref="/getkey">Submitanothermessage</a>
</body>
</html>
6. SpringBoot Starter自定義註解 - 介面加解密
目標
本章我們將編寫一個starter,目標如下:
1、對外提供 @OpenAPI 註解,使用此註解它會對接收的請求數據進行解密,對要返回的數據進行加密。
2、完成服務端使用示例
3、完成前端調用示例
加密規則
1、對業務數據進行AES加密,示意代碼:encryptData=AES("業務數據", aesKey)
2、對AES的key進行公鑰加密,示意代碼:encryptKey=RSA(aesKey, 公鑰)
3、簽名sign=md5(encryptData+encryptKey)
加密後請求示例
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
請求參數
服務端返回示例
pom.xml
定義註解
配置公私鑰
具體代搜行碼邏輯
定義切面和自動殲巧裝配
spring.factories
服務端修改
在業氏漏鍵務項目中引入jar 包
配置公私鑰
改動的地方很少,只需要在原介面增加@OpenAPI註解即可
前端修改
修改前代碼
修改後要先對參數加密,然後對返回數據解密
安裝兩個加密庫
封裝RSA、AES和Base64加解密
7. Spring boot-手把手教你使用Token
JWT由三部分組成,由類型和加密演算法的head(頭部),包含公共信息和自定義信息的playboard(負載),以及signature(簽名)組成。
就是頭部信息,這是由base64加密後的密文,base64是一種對稱加密演算法,解密後的json格式如下。頭部信息由type(類型)和 alg(加密演算法)組成。類型就是"JWT",加密演算法一般使用 HMAC SHA256加密演算法。
0 就是負載信息,加密後的json格式如下。負載信息一般由標准申明,公共聲明,私有聲明組成。
iss: jwt簽發者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時間,這個過期時間必須要大於簽發時間
nbf: 定義在什麼時間之前,該jwt都是不可用的.
iat: jwt的簽發時間
jti: jwt的唯一身份標識,主要用來作為一次性token,從而迴避重放攻擊。
公共的聲明和私有的聲明可以添加任何的信息,一般添加用戶的相關信息或其他業務需要的必要信息。但不建議添加敏感信息,因為該部分在客戶端可解密。
第三部分簽名是由base64加密後的頭部信息和負載信息以及secret組成的簽名,簽名演算法是有頭部信息定以的加密演算法,一般是HMAC SHA256。然後頭部,負載,簽名三部分組成了token。
pom.xml引入依賴
新增controller,提供token介面
CallbackService 生成token
返回的示例如下
定義自定義註解,在需要token校驗的方法上加上即可
新增AuthenticationInterceptor對第三方請求進行攔截,實現HandlerInterceptor介面
注冊AuthenticationInterceptor攔截器,對指定請求路徑進行攔截
在此文中,我們大致了解了Token的定義,獲取,校驗等方法。此外,Token 的無狀態,可擴展性,多平台跨域等特性,也讓Token廣泛應用在安全校驗領域中。在接下來的幾篇文章中,我將介紹如何使用Spring AOP進行加密,解密,驗簽等操作。
參考:
https://www.jianshu.com/p/576dbf44b2ae
8. spring boot調用加密狗
java開發加密狗的應用程序,應用於web項目。
springboot項目加密解決方案:配置pomxml用maven直接構建加密後的jar包。使用maven構建jar包;如果springboot項目使用到了JPA並且是用hibernate實現的,那麼啟動加密後的jar是會報錯的,創建服務命令:管理員進入cmd輸入 WinSWNET,exe install 即可創建服務;啟動服務即可。
"加密鎖"(也稱加密狗)最早由彩虹天地開發,現已成為軟體加密行業的代名詞。加密鎖是為軟體開發商提供的一種智能型的具有軟體保護功能的工具,它包含一個安裝在計算機並行口或 USB 口上的硬體,及一套適用於各種語言的介面軟體和工具軟體。加密鎖基於硬體保護技術,其目的是通過對軟體與數據的保護防止知識產權被非法使用。
9. Spring boot jar包加密(防止放在客戶端反編譯),XJar加密
需求常用但是時間不常有。有些能客戶接觸到jar包就很尷尬了。不要問為什麼尷尬。
1.首先目標系統-阿里鏡像 Centos8.2 不重要 有yum就行,主要環境是golang俗稱go
2.上操作
3.版本確認,檢查
4.把文件傳到linux上,注意需要兩個文件!重點別漏了 new.jar 和 xjar.go
5.cd到目錄,操作
6.得到如下文件
7.運行jar,普通運行
9.打成系統服務systemctl這個不講了,網路,或者我其他文章有
4.得到xjar.exe,跟linux差不多操作了
5.cd到目錄,然後操作
10. 「青鋒愛分享」Springboot+python之RSA加解密方案(RSA深入)二
本篇文章要結合上一節文章一起看。
青鋒愛分享-RSA-Springboot+Python整合
碼雲搜索: 青鋒 會有驚喜哦哦。
通過python生成的公鑰私鑰 格式PKCS1 。
生成pem格式如下:
私鑰頭(-----BEGIN RSA PRIVATE KEY-----)
私鑰尾(-----END RSA PRIVATE KEY-----)
我需要將此私鑰轉換為DER編碼的PKCS8未加密格式,以便與java伺服器代碼一起使用,特別是PKCS8EncodedKeySpec。我已經試過使用rsa和pkcs8命令的OpenSSL,如果有更簡單的辦法,沒有特別需要使用openssl。
RSA私鑰格式PKCS1和PKCS8相互轉換
RSA公鑰格式PKCS1和PKCS8相互轉換
以下轉換基於openssl命令的操作;
執行:openssl genrsa -out private.pem 1024
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlLm5++/wwSfq5KfY
H8q1AO/
Uo4OMcmoSz3IAp/7//ewIDAQAB
AoGBAJkMdvF+i9Kzc6YqMC0rfQJ3Zs+vFOtsbmQVAMnQ8JWBCJ1O8d/c60wRQgyb
lFCyO7VXOmoIJqX/Jr2aER8bFtG+
lOdOay7TkE45X/Wc7K9iZs2uuB7sylIvK/HVxxit6FGePa4RAkEA9e+VoAbxBv78
HyxRcStW+
n0UxgT55MPXWGdMRXUUOCNnMilaw/
HvK0IW3zpOgf/+/W565ROI/fjkR1qCD
rZJeHgqMWDlIUuR9+BdBAkAI8+
puQxMonRWTN+
-----END RSA PRIVATE KEY-----
執行:openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem
-----BEGIN PRIVATE KEY-----
+n
yHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+/T
uaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4xyahLPcgCn/v8WcxqDUh6VJ92
/
Q3fic/
+
nt0qVQJAOmMZ67caK+YHZ0M3Rp3adQgF+
//6OHlRQIElgect4wb
CbtfXWu9AfXNbTlXH39bnrlE4j9+
Yt1Zx5df0+
HLU0VEwSQa7rvmY=
-----END PRIVATE KEY-----
執行:openssl rsa -in pkcs8.pem -out pkcs1.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlLm5++/wwSfq5KfY
H8q1AO/
Uo4OMcmoSz3IAp/7//ewIDAQAB
AoGBAJkMdvF+i9Kzc6YqMC0rfQJ3Zs+vFOtsbmQVAMnQ8JWBCJ1O8d/c60wRQgyb
lFCyO7VXOmoIJqX/Jr2aER8bFtG+
lOdOay7TkE45X/Wc7K9iZs2uuB7sylIvK/HVxxit6FGePa4RAkEA9e+VoAbxBv78
HyxRcStW+
n0UxgT55MPXWGdMRXUUOCNnMilaw/
HvK0IW3zpOgf/+/W565ROI/fjkR1qCD
rZJeHgqMWDlIUuR9+BdBAkAI8+
puQxMonRWTN+
-----END RSA PRIVATE KEY-----
可以看出結果和1是一致的;
執行:openssl rsa -in private.pem -pubout -out public.pem
-----BEGIN PUBLIC KEY-----
+Kosybacfp8hzjn1fl2wT
7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/
/7/FnMag1IelSfdronPBDxazp6
NUmQZITsYK6CsEl/ewIDAQAB
-----END PUBLIC KEY-----
5. 從pkcs8私鑰中生成pkcs8公鑰
執行:openssl rsa -in pkcs8.pem -pubout -out public_pkcs8.pem
-----BEGIN PUBLIC KEY-----
+Kosybacfp8hzjn1fl2wT
7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/
/7/FnMag1IelSfdronPBDxazp6
NUmQZITsYK6CsEl/ewIDAQAB
-----END PUBLIC KEY-----
可以看出結果和4是一樣的;
執行:openssl rsa -pubin -in public.pem -RSAPublicKey_out
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOUubn4qizJtpx+nyHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA
78L3YjASmmU1uupiY5dC7o/TuaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4x
yahLPcgCn/=
-----END RSA PUBLIC KEY-----
openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOUubn4qizJtpx+nyHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA
78L3YjASmmU1uupiY5dC7o/TuaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4x
yahLPcgCn/=
-----END RSA PUBLIC KEY-----
可以看出轉換的結果是一致的;
執行:openssl rsa -RSAPublicKey_in -in pub_pkcs1.pem -pubout
-----BEGIN PUBLIC KEY-----
+Kosybacfp8hzjn1fl2wT
7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/
/7/FnMag1IelSfdronPBDxazp6
NUmQZITsYK6CsEl/ewIDAQAB
-----END PUBLIC KEY-----
可以看到和上面4,5的結果是一致的;
最後一點:
iOS上用的是pkcs8格式的公鑰
openssl用的是pkcs1格式的公鑰
知道私鑰以後是可以導出公鑰的,所以私鑰一定要保證安全
知道公鑰不可以導出私鑰
解決方案針對是window電腦。
配置:SystemRoot/ System32 環境變數。
1、郵件我的電腦-選擇下【屬性】。
2、選擇高級系統設置
3、選擇【高級】-【環境變數】
4、雙擊打開path,進行編輯
5、 接著我們在這名字後面加【;System32】就可以了。
安裝 Win64 OpenSSL,地址: http://slproweb.com/procts/Win32OpenSSL.html
下載後根據提示一步一步安裝,安裝完成後:
雙擊start.bat 啟動