Spark?實(shí)現(xiàn)自定義加密的示例代碼
Spark 實(shí)現(xiàn)自定義加密
一、建立加密和解密的自定義函數(shù)
import java.nio.charset.{StandardCharsets}
import java.util.Base64
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
object SparkUtil {
/**
* 處理密鑰
* @param secret 密鑰
*/
private def secretInit(secret:String)={
// 對(duì)密鑰長度進(jìn)行約束
val allowNumBits: Array[Int] = Array(16, 24, 32)
// 如果密鑰長度符合,將密鑰轉(zhuǎn)換為AES密鑰對(duì)象
if (allowNumBits.contains(secret.size)) {
new SecretKeySpec(
secret.getBytes(StandardCharsets.UTF_8),"AES")
}else{
throw new RuntimeException(
s"AES secret size of numBits ${secret.size} not in
permitted values (${allowNumBits.mkString(",")})")
}
}
/**
* 加密函數(shù)
* @param src 源數(shù)據(jù)
* @param secret 密鑰
*/
def encrypt(src:String,secret:String)={
// 獲取加密算法實(shí)例
val cipher: Cipher = Cipher.getInstance("AES")
// 初始化加密模式,使用給定的密鑰(需要先用key()對(duì)密鑰進(jìn)行處理)
cipher.init(Cipher.ENCRYPT_MODE,secretInit(secret))
// 執(zhí)行加密操作
val bytes: Array[Byte] = cipher.doFinal(src.getBytes(StandardCharset.UTF_8))
// 返回加密后的數(shù)據(jù)
Base64.getEncoder().encodeToString(bytes)
}
/**
* 解密函數(shù)
* @param dest 待解密數(shù)據(jù)
* @param secret 密鑰
*/
def decrypt(dest:String,secret:String)={
val cipher: Cipher = Cipher.getInstance("AES")
cipher.init(Cipher.DECRYPT_MODE,secretInit(secret))
val bytes: Array[Byte] = cipher.doFinal(
Base64.getDecoder.decode(dest))
new String(bytes, StandardCharsets.UTF_8)
}
}二、在 Spark 環(huán)境下導(dǎo)入對(duì)象實(shí)現(xiàn)的方法,并在 SparkSession 中注冊 UDF 函數(shù)
import core.SparkUtil.{encrypt,decrypt}
spark.udf.register(
"aes_encrypt",
(src:String,secret:String)
=>encrypt(src, secret),StringType)
spark.udf.register(
"aes_decrypt",
(src:String,secret:String)
=>decrypt(src, secret),StringType)三、在SparkSQL中調(diào)用函數(shù)
val frm: DataFrame = spark.createDataFrame(Seq(
Test(1,Array("money","freedom"),Map("java"->85,"mysql"->67)),
Test(2,Array("beauty","beauty"),Map("java"->72,"mysql"->90)),
Test(3,Array("sports","beauty"),Map("java"->76,"html"->52))
))
val secret = "henryyb2211ariel"
val frmEncrypt: DataFrame = frm
.select($"id",
callUDF(
"aes_encrypt",
array_join($"hobbies", ","),
lit(secret)
).as("encrypted_hobbies")
)
val frmDecrypt: DataFrame = frmEncrypt
.select($"id",
split(
callUDF(
"aes_decrypt",
$"encrypted_hobbies",
lit(secret)
),
","
).as("hobbies")
).show()到此這篇關(guān)于Spark 實(shí)現(xiàn)自定義加密的文章就介紹到這了,更多相關(guān)Spark 自定義加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 2.x基礎(chǔ)教程之使用@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)的方法
在Spring Boot中編寫定時(shí)任務(wù)是非常簡單的事,下面通過實(shí)例介紹如何在Spring Boot中創(chuàng)建定時(shí)任務(wù),實(shí)現(xiàn)每過5秒輸出一個(gè)當(dāng)前時(shí)間,感興趣的朋友跟隨小編一起看看吧2021-07-07
Java 數(shù)組轉(zhuǎn)List的四種方式小結(jié)
本文主要介紹了四種將Java數(shù)組轉(zhuǎn)換為List的方法,包括使用Arrays.asList、ArrayList構(gòu)造器、Collections.addAll以及JDK8的Stream,具有一定的參考價(jià)值,感興趣的可以了解一下2024-10-10
基于servlet的執(zhí)行原理與生命周期(全面解析)
下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
springboot2.6.4集成swagger3.0遇到的坑及解決方法
這篇文章主要介紹了springboot2.6.4如何集成swagger3.0,在集成的過程中遇到很多問題,本文給大家分享四種問題及相應(yīng)的解決方案,需要的朋友可以參考下2022-03-03
如何使用eclipse搭建maven多module項(xiàng)目(構(gòu)建父子項(xiàng)目)
這篇文章主要介紹了如何使用eclipse搭建maven多module項(xiàng)目(構(gòu)建父子項(xiàng)目) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
Java數(shù)據(jù)結(jié)構(gòu)之雙端鏈表原理與實(shí)現(xiàn)方法
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之雙端鏈表原理與實(shí)現(xiàn)方法,簡單描述了雙端鏈表的概念、原理并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)雙端鏈表的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
如何使用IDEA2022.1?創(chuàng)建Spring?Boot項(xiàng)目
這篇文章主要介紹了如何使用IDEA2022.1?創(chuàng)建Spring?Boot項(xiàng)目,大家在使用idea開發(fā)工具時(shí)發(fā)現(xiàn)給以往的版本略微的不同,細(xì)心的小編在此記錄下,需要的朋友可以參考下2022-08-08
springmvc @ResponseStatus和ResponseEntity的使用
這篇文章主要介紹了springmvc @ResponseStatus和ResponseEntity的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

