您的位置:首页 > 财经 > 金融 > Spark 实现自定义加密

Spark 实现自定义加密

2024/11/15 20:57:36 来源:https://blog.csdn.net/m0_74120525/article/details/140418836  浏览:    关键词:Spark 实现自定义加密

在这里插入图片描述
在这里插入图片描述

文章目录

    • Spark 实现自定义加密
        • 一、建立加密和解密的自定义函数
        • 二、在 Spark 环境下导入对象实现的方法,并在 SparkSession 中注册 UDF 函数
        • 三、在SparkSQL中调用函数

Spark 实现自定义加密

一、建立加密和解密的自定义函数
import java.nio.charset.{StandardCharsets}
import java.util.Base64
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpecobject SparkUtil {/*** 处理密钥* @param secret 密钥*/private def secretInit(secret:String)={// 对密钥长度进行约束val allowNumBits: Array[Int] = Array(16, 24, 32)// 如果密钥长度符合,将密钥转换为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(",")})")}}/*** 加密函数* @param src 源数据* @param secret 密钥*/def encrypt(src:String,secret:String)={// 获取加密算法实例val cipher: Cipher = Cipher.getInstance("AES")// 初始化加密模式,使用给定的密钥(需要先用key()对密钥进行处理)cipher.init(Cipher.ENCRYPT_MODE,secretInit(secret))// 执行加密操作val bytes: Array[Byte] = cipher.doFinal(src.getBytes(StandardCharset.UTF_8))// 返回加密后的数据Base64.getEncoder().encodeToString(bytes)}/*** 解密函数* @param dest 待解密数据* @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 环境下导入对象实现的方法,并在 SparkSession 中注册 UDF 函数
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中调用函数
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()

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com