Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
bme-access-guangdong-upload
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
李洪明
bme-access-guangdong-upload
Commits
fe6a499a
Commit
fe6a499a
authored
Dec 18, 2025
by
李洪明
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加登录鉴权接口
parent
1a585e59
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
181 additions
and
156 deletions
+181
-156
HttpUtils.java
src/main/java/com/bme/access/guangdong/common/HttpUtils.java
+4
-0
LoginConfig.java
...ain/java/com/bme/access/guangdong/config/LoginConfig.java
+171
-0
LoginService.java
...n/java/com/bme/access/guangdong/service/LoginService.java
+6
-156
No files found.
src/main/java/com/bme/access/guangdong/common/HttpUtils.java
View file @
fe6a499a
...
...
@@ -2,6 +2,7 @@ package com.bme.access.guangdong.common;
import
com.alibaba.fastjson.JSONObject
;
import
com.alibaba.fastjson.serializer.SerializerFeature
;
import
com.bme.access.guangdong.config.LoginConfig
;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.http.HttpResponse
;
import
org.apache.http.client.HttpClient
;
...
...
@@ -135,6 +136,9 @@ public class HttpUtils {
HttpPost
request
=
new
HttpPost
(
buildUrl
(
host
,
path
,
querys
));
Map
<
String
,
String
>
headers
=
new
HashMap
<>();
headers
.
put
(
"Content-Type"
,
"application/json"
);
if
(
StringUtils
.
isNotBlank
(
LoginConfig
.
token
))
{
headers
.
put
(
"token"
,
LoginConfig
.
token
);
}
for
(
Map
.
Entry
<
String
,
String
>
e
:
headers
.
entrySet
())
{
request
.
addHeader
(
e
.
getKey
(),
e
.
getValue
());
}
...
...
src/main/java/com/bme/access/guangdong/config/LoginConfig.java
0 → 100644
View file @
fe6a499a
package
com
.
bme
.
access
.
guangdong
.
config
;
import
com.alibaba.fastjson.JSON
;
import
com.bme.access.guangdong.common.HttpUtils
;
import
com.bme.access.guangdong.model.LoginResult
;
import
org.apache.http.HttpResponse
;
import
org.apache.http.util.EntityUtils
;
import
org.json.JSONObject
;
import
org.springframework.context.annotation.Configuration
;
import
javax.annotation.PostConstruct
;
import
javax.crypto.Cipher
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.security.*
;
import
java.security.spec.PKCS8EncodedKeySpec
;
import
java.security.spec.X509EncodedKeySpec
;
import
java.util.Base64
;
import
java.util.Map
;
import
java.util.TreeMap
;
@Configuration
public
class
LoginConfig
{
private
static
String
appId
=
"mj441323gdzhgt$w_8kc_0uf"
;
private
static
String
secret
=
"pBukGgdLKVjKGp-8wbmJfOqX1S5ibTMW"
;
private
static
String
path
=
"/api/qymj/login"
;
private
static
String
host
=
"http://113.96.111.154:18830"
;
public
static
String
token
=
""
;
@PostConstruct
public
LoginResult
login
()
{
LoginResult
loginResult
=
new
LoginResult
();
String
se
=
encryptWithPrivateKey
(
secret
);
String
jsonData
=
"{\"APPID\": \""
+
appId
+
"\", \"SECRET\": \""
+
secret
+
"\"}"
;
String
sign
=
getSign
(
jsonData
);
String
body
=
"{\"APPID\": \""
+
appId
+
"\", \"SECRET\": \""
+
se
+
"\", \"SIGN\": \""
+
sign
+
"\"}"
;
try
{
HttpResponse
response
=
HttpUtils
.
sendPost
(
host
,
path
,
null
,
body
);
String
result
=
EntityUtils
.
toString
(
response
.
getEntity
());
loginResult
=
JSON
.
parseObject
(
result
,
LoginResult
.
class
);
if
(
loginResult
.
getData
()
!=
null
)
{
String
aes_secret
=
loginResult
.
getData
().
getAes_secret
();
String
aesSecret
=
decryptWithPublicKey
(
aes_secret
);
// 用RSA公钥进行解密
loginResult
.
getData
().
setAes_secret
(
aesSecret
);
String
accessToken
=
aesDecrypt
(
loginResult
.
getData
().
getAccess_token
(),
aesSecret
);
loginResult
.
getData
().
setAccess_token
(
accessToken
);
token
=
accessToken
;
return
loginResult
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
loginResult
;
}
private
String
getSign
(
String
jsonStr
)
{
org
.
json
.
JSONObject
jsonObj
=
new
org
.
json
.
JSONObject
(
jsonStr
);
Map
<
String
,
Object
>
sortedMap
=
new
TreeMap
<>(
jsonObj
.
toMap
());
// 使用TreeMap自动排序键值对
String
sortedJsonStr
=
new
JSONObject
(
sortedMap
).
toString
();
// 将排序后的Map转换回JSON字符串
try
{
MessageDigest
digest
=
MessageDigest
.
getInstance
(
"SHA-256"
);
byte
[]
encodedhash
=
digest
.
digest
(
sortedJsonStr
.
getBytes
());
// 生成哈希值字节数组
String
sha256hex
=
bytesToHex
(
encodedhash
);
// 将字节数组转换为十六进制字符串
// System.out.println(sha256hex); // 输出哈希值
return
encryptWithPrivateKey
(
sha256hex
);
}
catch
(
NoSuchAlgorithmException
e
)
{
e
.
printStackTrace
();
}
return
""
;
}
private
static
String
bytesToHex
(
byte
[]
bytes
)
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
bytes
.
length
;
i
++)
{
sb
.
append
(
String
.
format
(
"%02x"
,
bytes
[
i
]));
}
return
sb
.
toString
();
}
private
static
String
encryptWithPrivateKey
(
String
plainText
)
{
String
privateKeyPEM
=
"-----BEGIN PRIVATE KEY-----\n"
+
"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDhyADfLz7QruMO\n"
+
"LlSuGo8LGXdOanh06mGVwi8KmTURBwZU2jd9iritYExOW54BuTuYiKZaLn8N9zoM\n"
+
"cQzn4OANTh//3kpqpcNvyyZ5gssRamIM707m0tvC06Rw029vfqwYUFagigNChdF9\n"
+
"KaKbvkMFBvyMyu/QIz+ESp2YEeauwX1g24Ccnyqda1O914z2oBcQXmBsZEjKR+nw\n"
+
"1/RjHeyc9fUecY3lIKMN9R/nSdD0rTGDMnKabl0l28XS89fogy9UWX9Ejx9k91/v\n"
+
"ciQAzYZBD7zdfK+9y8Z4UNRl8/3sDtCxpO+nkmuMSL1TYJfBjelJfFvmPaxx98CG\n"
+
"wNXAp1SVAgMBAAECggEAXZpvUhfiMN3wYBaxIKT+HJnoLmhRnBb3cgDZQ8mUiISj\n"
+
"CVaWnsN+INLFj87HyOskW+57GPQh1IZkWHgd45wFBz8WYRulOmWSiqxsPQAOdB/o\n"
+
"mngz+9n7JeBcUjI2BsE7U7Eq2M+e3ltgKEW0lmDgpBrrZOtVVLLoSE4u27bALj5d\n"
+
"uBNLflc+qByjcaM2Xvi+IXcvmdDo+e4DT8T/0PXoPbUdq2QUe4Qwc173xouQ1w1y\n"
+
"/zEB0Bk4gFJ6ZJhbu2ekASaeTbboO7t4YAOseKFKHdvksBpu/h74OXvKsBbsuFps\n"
+
"kZAmFfR5CbvWv/GyXetNS54xXiykBumZVksMva/7GQKBgQD+GVXGepjawLKW8d3l\n"
+
"4ZJGr/7kHENEc9jyTVYue6YI67/zZ6BfuQVBQnNRBnKRCBel9XoGadvb54FV40sl\n"
+
"F6ezCYtqB7SE4Q2Vdj/UgTdB1H3f9VAVAGmK7sk235anseYayIuQcJ2C5jxTHzMA\n"
+
"UnRjqhy9BCKUdYTLhgdO4uYakwKBgQDjeG7CinjDTvs5cwYb0i8QVQQswv/EoszW\n"
+
"iAKYwOpbeGbDRzRgxehtY2qjPUwXGf8I/oDqqY/Xl69XziphyZuz/RD8RA9UmMuo\n"
+
"aGMOY2+Sp6WH/pahjmLoX3zo/1lHFUnsp0Tn1cCgE8VKt45yyRDJHT1QkBOSqrS4\n"
+
"qhMtpnpFNwKBgC5204iHwou90OppL/ppVSY36JQt1t8dj/4+xhOZ6LKY6XDI8jqO\n"
+
"yrc0P4IBe9GpeSmPydCCawG7Q5tBBOyzdqb2h9fLsObbgHBkPyfMuR4AjUP2x74P\n"
+
"ZT1SjNjL6fCgR0N+iIbREPxuvXk1q03TxhSzdq3Zo7kiBDZzO8LhGtKhAoGATXkq\n"
+
"OCYTZWnUFMgBT55xmx1pk5lCpYVRQMwIHmCuMUM7tMzeoQsm04Llwf1RmhinjTep\n"
+
"TsM7k5E9DinQs4eH+XB6xYCkvApiatRK0I67ZHam4T+rrBCjzUMgdvbpQFWW3PxH\n"
+
"crKRrbOuIXmNEbk7d1P3GyZHFFABx1ddutGVmVcCgYAPkLeLXQ9tX/QHoR9V0I8T\n"
+
"mFOTlAjAsRk9XRq3bgzdhps3J2+SO0WY4PjHtpMsQxUtfVar0VXQjVM4OOE6hZqt\n"
+
"vzkRDT8rANRvF1plDLUR2Yyd8APsRD843dBByAuKzxVhS4DkVU0uCi3wizsJ5YiL\n"
+
"Ub0o3BeLfLrS2ja3ihcwBA==\n"
+
"-----END PRIVATE KEY-----\n"
;
// 移除PEM头尾并解码Base64
String
privateKeyContent
=
privateKeyPEM
.
replace
(
"-----BEGIN PRIVATE KEY-----"
,
""
)
.
replace
(
"-----END PRIVATE KEY-----"
,
""
)
.
replaceAll
(
"\\s"
,
""
);
// 移除所有空白字符,包括换行符和空格
byte
[]
keyBytes
=
Base64
.
getDecoder
().
decode
(
privateKeyContent
);
try
{
KeyFactory
keyFactory
=
KeyFactory
.
getInstance
(
"RSA"
);
PKCS8EncodedKeySpec
keySpec
=
new
PKCS8EncodedKeySpec
(
keyBytes
);
PrivateKey
privateKey
=
keyFactory
.
generatePrivate
(
keySpec
);
Cipher
cipher
=
Cipher
.
getInstance
(
"RSA/ECB/PKCS1Padding"
);
// 使用PKCS#1填充模式
cipher
.
init
(
Cipher
.
ENCRYPT_MODE
,
privateKey
);
byte
[]
encryptedBytes
=
cipher
.
doFinal
(
plainText
.
getBytes
());
return
Base64
.
getEncoder
().
encodeToString
(
encryptedBytes
);
// 返回Base64编码的字符串,便于查看和传输
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
""
;
}
private
static
String
decryptWithPublicKey
(
String
encryptedText
)
{
String
publicKeyPEM
=
"-----BEGIN PUBLIC KEY-----\n"
+
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4cgA3y8+0K7jDi5UrhqP\n"
+
"Cxl3Tmp4dOphlcIvCpk1EQcGVNo3fYq4rWBMTlueAbk7mIimWi5/Dfc6DHEM5+Dg\n"
+
"DU4f/95KaqXDb8smeYLLEWpiDO9O5tLbwtOkcNNvb36sGFBWoIoDQoXRfSmim75D\n"
+
"BQb8jMrv0CM/hEqdmBHmrsF9YNuAnJ8qnWtTvdeM9qAXEF5gbGRIykfp8Nf0Yx3s\n"
+
"nPX1HnGN5SCjDfUf50nQ9K0xgzJymm5dJdvF0vPX6IMvVFl/RI8fZPdf73IkAM2G\n"
+
"QQ+83XyvvcvGeFDUZfP97A7QsaTvp5JrjEi9U2CXwY3pSXxb5j2scffAhsDVwKdU\n"
+
"lQIDAQAB\n"
+
"-----END PUBLIC KEY-----"
;
// 移除PEM头尾并解码Base64
String
publicKeyContent
=
publicKeyPEM
.
replace
(
"-----BEGIN PUBLIC KEY-----"
,
""
)
.
replace
(
"-----END PUBLIC KEY-----"
,
""
)
.
replaceAll
(
"\\s"
,
""
);
// 移除所有空白字符,包括换行符和空格
byte
[]
encryptedBytes
=
Base64
.
getDecoder
().
decode
(
encryptedText
);
byte
[]
publicKeyBytes
=
Base64
.
getDecoder
().
decode
(
publicKeyContent
);
X509EncodedKeySpec
keySpec
=
new
X509EncodedKeySpec
(
publicKeyBytes
);
try
{
KeyFactory
keyFactory
=
KeyFactory
.
getInstance
(
"RSA"
);
PublicKey
publicKey
=
keyFactory
.
generatePublic
(
keySpec
);
Cipher
cipher
=
Cipher
.
getInstance
(
"RSA/ECB/PKCS1Padding"
);
cipher
.
init
(
Cipher
.
DECRYPT_MODE
,
publicKey
);
byte
[]
decryptedBytes
=
cipher
.
doFinal
(
encryptedBytes
);
return
new
String
(
decryptedBytes
,
"UTF-8"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
""
;
}
// AES密钥解密
public
static
String
aesDecrypt
(
String
encryptedData
,
String
key
)
throws
Exception
{
byte
[]
encryptedBytes
=
Base64
.
getDecoder
().
decode
(
encryptedData
);
SecretKeySpec
secretKey
=
new
SecretKeySpec
(
key
.
getBytes
(
"UTF-8"
),
"AES"
);
Cipher
cipher
=
Cipher
.
getInstance
(
"AES/ECB/PKCS5Padding"
);
cipher
.
init
(
Cipher
.
DECRYPT_MODE
,
secretKey
);
byte
[]
decryptedBytes
=
cipher
.
doFinal
(
encryptedBytes
);
return
new
String
(
decryptedBytes
,
"UTF-8"
);
}
}
src/main/java/com/bme/access/guangdong/service/LoginService.java
View file @
fe6a499a
package
com
.
bme
.
access
.
guangdong
.
service
;
import
com.alibaba.fastjson.JSON
;
import
com.bme.access.guangdong.common.HttpUtils
;
import
com.bme.access.guangdong.config.LoginConfig
;
import
com.bme.access.guangdong.model.LoginResult
;
import
org.apache.http.HttpResponse
;
import
org.apache.http.util.EntityUtils
;
import
org.json.JSONObject
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
javax.crypto.Cipher
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.security.*
;
import
java.security.spec.PKCS8EncodedKeySpec
;
import
java.security.spec.X509EncodedKeySpec
;
import
java.util.Base64
;
import
java.util.Map
;
import
java.util.TreeMap
;
@Service
public
class
LoginService
{
private
static
String
appId
=
"mj441323gdzhgt$w_8kc_0uf"
;
private
static
String
secret
=
"pBukGgdLKVjKGp-8wbmJfOqX1S5ibTMW"
;
private
static
String
path
=
"/api/qymj/login"
;
private
static
String
host
=
"http://113.96.111.154:18830"
;
public
LoginResult
login
()
{
LoginResult
loginResult
=
new
LoginResult
();
String
se
=
encryptWithPrivateKey
(
secret
);
String
jsonData
=
"{\"APPID\": \""
+
appId
+
"\", \"SECRET\": \""
+
secret
+
"\"}"
;
String
sign
=
getSign
(
jsonData
);
String
body
=
"{\"APPID\": \""
+
appId
+
"\", \"SECRET\": \""
+
se
+
"\", \"SIGN\": \""
+
sign
+
"\"}"
;
try
{
HttpResponse
response
=
HttpUtils
.
sendPost
(
host
,
path
,
null
,
body
);
String
result
=
EntityUtils
.
toString
(
response
.
getEntity
());
loginResult
=
JSON
.
parseObject
(
result
,
LoginResult
.
class
);
if
(
loginResult
.
getData
()
!=
null
)
{
String
aes_secret
=
loginResult
.
getData
().
getAes_secret
();
String
aesSecret
=
decryptWithPublicKey
(
aes_secret
);
// 用RSA公钥进行解密
loginResult
.
getData
().
setAes_secret
(
aesSecret
);
String
accessToken
=
aesDecrypt
(
loginResult
.
getData
().
getAccess_token
(),
aesSecret
);
loginResult
.
getData
().
setAccess_token
(
accessToken
);
return
loginResult
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
loginResult
;
}
private
String
getSign
(
String
jsonStr
)
{
JSONObject
jsonObj
=
new
JSONObject
(
jsonStr
);
Map
<
String
,
Object
>
sortedMap
=
new
TreeMap
<>(
jsonObj
.
toMap
());
// 使用TreeMap自动排序键值对
String
sortedJsonStr
=
new
JSONObject
(
sortedMap
).
toString
();
// 将排序后的Map转换回JSON字符串
try
{
MessageDigest
digest
=
MessageDigest
.
getInstance
(
"SHA-256"
);
byte
[]
encodedhash
=
digest
.
digest
(
sortedJsonStr
.
getBytes
());
// 生成哈希值字节数组
String
sha256hex
=
bytesToHex
(
encodedhash
);
// 将字节数组转换为十六进制字符串
// System.out.println(sha256hex); // 输出哈希值
return
encryptWithPrivateKey
(
sha256hex
);
}
catch
(
NoSuchAlgorithmException
e
)
{
e
.
printStackTrace
();
}
return
""
;
}
private
static
String
bytesToHex
(
byte
[]
bytes
)
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
bytes
.
length
;
i
++)
{
sb
.
append
(
String
.
format
(
"%02x"
,
bytes
[
i
]));
}
return
sb
.
toString
();
}
private
static
String
encryptWithPrivateKey
(
String
plainText
)
{
String
privateKeyPEM
=
"-----BEGIN PRIVATE KEY-----\n"
+
"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDhyADfLz7QruMO\n"
+
"LlSuGo8LGXdOanh06mGVwi8KmTURBwZU2jd9iritYExOW54BuTuYiKZaLn8N9zoM\n"
+
"cQzn4OANTh//3kpqpcNvyyZ5gssRamIM707m0tvC06Rw029vfqwYUFagigNChdF9\n"
+
"KaKbvkMFBvyMyu/QIz+ESp2YEeauwX1g24Ccnyqda1O914z2oBcQXmBsZEjKR+nw\n"
+
"1/RjHeyc9fUecY3lIKMN9R/nSdD0rTGDMnKabl0l28XS89fogy9UWX9Ejx9k91/v\n"
+
"ciQAzYZBD7zdfK+9y8Z4UNRl8/3sDtCxpO+nkmuMSL1TYJfBjelJfFvmPaxx98CG\n"
+
"wNXAp1SVAgMBAAECggEAXZpvUhfiMN3wYBaxIKT+HJnoLmhRnBb3cgDZQ8mUiISj\n"
+
"CVaWnsN+INLFj87HyOskW+57GPQh1IZkWHgd45wFBz8WYRulOmWSiqxsPQAOdB/o\n"
+
"mngz+9n7JeBcUjI2BsE7U7Eq2M+e3ltgKEW0lmDgpBrrZOtVVLLoSE4u27bALj5d\n"
+
"uBNLflc+qByjcaM2Xvi+IXcvmdDo+e4DT8T/0PXoPbUdq2QUe4Qwc173xouQ1w1y\n"
+
"/zEB0Bk4gFJ6ZJhbu2ekASaeTbboO7t4YAOseKFKHdvksBpu/h74OXvKsBbsuFps\n"
+
"kZAmFfR5CbvWv/GyXetNS54xXiykBumZVksMva/7GQKBgQD+GVXGepjawLKW8d3l\n"
+
"4ZJGr/7kHENEc9jyTVYue6YI67/zZ6BfuQVBQnNRBnKRCBel9XoGadvb54FV40sl\n"
+
"F6ezCYtqB7SE4Q2Vdj/UgTdB1H3f9VAVAGmK7sk235anseYayIuQcJ2C5jxTHzMA\n"
+
"UnRjqhy9BCKUdYTLhgdO4uYakwKBgQDjeG7CinjDTvs5cwYb0i8QVQQswv/EoszW\n"
+
"iAKYwOpbeGbDRzRgxehtY2qjPUwXGf8I/oDqqY/Xl69XziphyZuz/RD8RA9UmMuo\n"
+
"aGMOY2+Sp6WH/pahjmLoX3zo/1lHFUnsp0Tn1cCgE8VKt45yyRDJHT1QkBOSqrS4\n"
+
"qhMtpnpFNwKBgC5204iHwou90OppL/ppVSY36JQt1t8dj/4+xhOZ6LKY6XDI8jqO\n"
+
"yrc0P4IBe9GpeSmPydCCawG7Q5tBBOyzdqb2h9fLsObbgHBkPyfMuR4AjUP2x74P\n"
+
"ZT1SjNjL6fCgR0N+iIbREPxuvXk1q03TxhSzdq3Zo7kiBDZzO8LhGtKhAoGATXkq\n"
+
"OCYTZWnUFMgBT55xmx1pk5lCpYVRQMwIHmCuMUM7tMzeoQsm04Llwf1RmhinjTep\n"
+
"TsM7k5E9DinQs4eH+XB6xYCkvApiatRK0I67ZHam4T+rrBCjzUMgdvbpQFWW3PxH\n"
+
"crKRrbOuIXmNEbk7d1P3GyZHFFABx1ddutGVmVcCgYAPkLeLXQ9tX/QHoR9V0I8T\n"
+
"mFOTlAjAsRk9XRq3bgzdhps3J2+SO0WY4PjHtpMsQxUtfVar0VXQjVM4OOE6hZqt\n"
+
"vzkRDT8rANRvF1plDLUR2Yyd8APsRD843dBByAuKzxVhS4DkVU0uCi3wizsJ5YiL\n"
+
"Ub0o3BeLfLrS2ja3ihcwBA==\n"
+
"-----END PRIVATE KEY-----\n"
;
// 移除PEM头尾并解码Base64
String
privateKeyContent
=
privateKeyPEM
.
replace
(
"-----BEGIN PRIVATE KEY-----"
,
""
)
.
replace
(
"-----END PRIVATE KEY-----"
,
""
)
.
replaceAll
(
"\\s"
,
""
);
// 移除所有空白字符,包括换行符和空格
byte
[]
keyBytes
=
Base64
.
getDecoder
().
decode
(
privateKeyContent
);
try
{
KeyFactory
keyFactory
=
KeyFactory
.
getInstance
(
"RSA"
);
PKCS8EncodedKeySpec
keySpec
=
new
PKCS8EncodedKeySpec
(
keyBytes
);
PrivateKey
privateKey
=
keyFactory
.
generatePrivate
(
keySpec
);
Cipher
cipher
=
Cipher
.
getInstance
(
"RSA/ECB/PKCS1Padding"
);
// 使用PKCS#1填充模式
cipher
.
init
(
Cipher
.
ENCRYPT_MODE
,
privateKey
);
byte
[]
encryptedBytes
=
cipher
.
doFinal
(
plainText
.
getBytes
());
return
Base64
.
getEncoder
().
encodeToString
(
encryptedBytes
);
// 返回Base64编码的字符串,便于查看和传输
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
""
;
}
@Autowired
private
LoginConfig
loginConfig
;
private
static
String
decryptWithPublicKey
(
String
encryptedText
)
{
String
publicKeyPEM
=
"-----BEGIN PUBLIC KEY-----\n"
+
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4cgA3y8+0K7jDi5UrhqP\n"
+
"Cxl3Tmp4dOphlcIvCpk1EQcGVNo3fYq4rWBMTlueAbk7mIimWi5/Dfc6DHEM5+Dg\n"
+
"DU4f/95KaqXDb8smeYLLEWpiDO9O5tLbwtOkcNNvb36sGFBWoIoDQoXRfSmim75D\n"
+
"BQb8jMrv0CM/hEqdmBHmrsF9YNuAnJ8qnWtTvdeM9qAXEF5gbGRIykfp8Nf0Yx3s\n"
+
"nPX1HnGN5SCjDfUf50nQ9K0xgzJymm5dJdvF0vPX6IMvVFl/RI8fZPdf73IkAM2G\n"
+
"QQ+83XyvvcvGeFDUZfP97A7QsaTvp5JrjEi9U2CXwY3pSXxb5j2scffAhsDVwKdU\n"
+
"lQIDAQAB\n"
+
"-----END PUBLIC KEY-----"
;
// 移除PEM头尾并解码Base64
String
publicKeyContent
=
publicKeyPEM
.
replace
(
"-----BEGIN PUBLIC KEY-----"
,
""
)
.
replace
(
"-----END PUBLIC KEY-----"
,
""
)
.
replaceAll
(
"\\s"
,
""
);
// 移除所有空白字符,包括换行符和空格
byte
[]
encryptedBytes
=
Base64
.
getDecoder
().
decode
(
encryptedText
);
byte
[]
publicKeyBytes
=
Base64
.
getDecoder
().
decode
(
publicKeyContent
);
X509EncodedKeySpec
keySpec
=
new
X509EncodedKeySpec
(
publicKeyBytes
);
try
{
KeyFactory
keyFactory
=
KeyFactory
.
getInstance
(
"RSA"
);
PublicKey
publicKey
=
keyFactory
.
generatePublic
(
keySpec
);
Cipher
cipher
=
Cipher
.
getInstance
(
"RSA/ECB/PKCS1Padding"
);
cipher
.
init
(
Cipher
.
DECRYPT_MODE
,
publicKey
);
byte
[]
decryptedBytes
=
cipher
.
doFinal
(
encryptedBytes
);
return
new
String
(
decryptedBytes
,
"UTF-8"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
""
;
public
LoginResult
login
(){
return
loginConfig
.
login
();
}
// AES密钥解密
public
static
String
aesDecrypt
(
String
encryptedData
,
String
key
)
throws
Exception
{
byte
[]
encryptedBytes
=
Base64
.
getDecoder
().
decode
(
encryptedData
);
SecretKeySpec
secretKey
=
new
SecretKeySpec
(
key
.
getBytes
(
"UTF-8"
),
"AES"
);
Cipher
cipher
=
Cipher
.
getInstance
(
"AES/ECB/PKCS5Padding"
);
cipher
.
init
(
Cipher
.
DECRYPT_MODE
,
secretKey
);
byte
[]
decryptedBytes
=
cipher
.
doFinal
(
encryptedBytes
);
return
new
String
(
decryptedBytes
,
"UTF-8"
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment