Spark?實現(xiàn)自定義加密的示例代碼
Spark 實現(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)={ // 對密鑰長度進(jìn)行約束 val allowNumBits: Array[Int] = Array(16, 24, 32) // 如果密鑰長度符合,將密鑰轉(zhuǎn)換為AES密鑰對象 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)={ // 獲取加密算法實例 val cipher: Cipher = Cipher.getInstance("AES") // 初始化加密模式,使用給定的密鑰(需要先用key()對密鑰進(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)入對象實現(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 實現(xiàn)自定義加密的文章就介紹到這了,更多相關(guān)Spark 自定義加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 2.x基礎(chǔ)教程之使用@Scheduled實現(xiàn)定時任務(wù)的方法
在Spring Boot中編寫定時任務(wù)是非常簡單的事,下面通過實例介紹如何在Spring Boot中創(chuàng)建定時任務(wù),實現(xiàn)每過5秒輸出一個當(dāng)前時間,感興趣的朋友跟隨小編一起看看吧2021-07-07Java 數(shù)組轉(zhuǎn)List的四種方式小結(jié)
本文主要介紹了四種將Java數(shù)組轉(zhuǎn)換為List的方法,包括使用Arrays.asList、ArrayList構(gòu)造器、Collections.addAll以及JDK8的Stream,具有一定的參考價值,感興趣的可以了解一下2024-10-10基于servlet的執(zhí)行原理與生命周期(全面解析)
下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12springboot2.6.4集成swagger3.0遇到的坑及解決方法
這篇文章主要介紹了springboot2.6.4如何集成swagger3.0,在集成的過程中遇到很多問題,本文給大家分享四種問題及相應(yīng)的解決方案,需要的朋友可以參考下2022-03-03如何使用eclipse搭建maven多module項目(構(gòu)建父子項目)
這篇文章主要介紹了如何使用eclipse搭建maven多module項目(構(gòu)建父子項目) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Java數(shù)據(jù)結(jié)構(gòu)之雙端鏈表原理與實現(xiàn)方法
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之雙端鏈表原理與實現(xiàn)方法,簡單描述了雙端鏈表的概念、原理并結(jié)合實例形式分析了java實現(xiàn)雙端鏈表的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目
這篇文章主要介紹了如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目,大家在使用idea開發(fā)工具時發(fā)現(xiàn)給以往的版本略微的不同,細(xì)心的小編在此記錄下,需要的朋友可以參考下2022-08-08springmvc @ResponseStatus和ResponseEntity的使用
這篇文章主要介紹了springmvc @ResponseStatus和ResponseEntity的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07