spark 实现自定义加密
一、建立加密和解密的自定义函数
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)={
// 对密钥长度进行约束
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()到此这篇关于spark 实现自定义加密的文章就介绍到这了,更多相关spark 自定义加密内容请搜索3w代码以前的文章或继续浏览下面的相关文章希望大家以后多多支持3w代码!
发表评论