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代码!
发表评论