Spark 实现自定义加密的示例代码

 更新时间:2024年07月18日 14:31:38   作者:Byyyi耀  
这篇文章主要介绍了Spark 实现自定义加密的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

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 自定义加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 高内聚低耦合原则_动力节点Java学院整理

    高内聚低耦合原则_动力节点Java学院整理

    耦合度就是某模块(类)与其它模块(类)之间的关联、感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计及编码质量评价的一个标准
    2017-08-08
  • Java三目运算中隐藏的自动拆装箱

    Java三目运算中隐藏的自动拆装箱

    这篇文章主要介绍了Java三目运算中隐藏的自动拆装箱,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • Springboot @RequestBody注解踩坑记录

    Springboot @RequestBody注解踩坑记录

    这篇文章主要介绍了Springboot @RequestBody注解踩坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot中配置log4j2日志详解

    SpringBoot中配置log4j2日志详解

    这篇文章主要介绍了SpringBoot中配置log4j2日志详解,Apache Log4j2 是对原先的 Log4j 项目的升级版本,参考了 logback 的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,需要的朋友可以参考下
    2023-11-11
  • mybatis-plus分页查询的实现示例

    mybatis-plus分页查询的实现示例

    这篇文章主要介绍了mybatis-plus分页查询的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java用jxl读取excel并保存到数据库的方法

    Java用jxl读取excel并保存到数据库的方法

    这篇文章主要为大家详细介绍了Java用jxl读取excel并保存到数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 深入理解Java中的构造函数引用和方法引用

    深入理解Java中的构造函数引用和方法引用

    java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与相同,无返回值。方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。下面我们来详细了解一下它们吧
    2019-06-06
  • 深入剖析理解AsyncGetCallTrace源码底层原理

    深入剖析理解AsyncGetCallTrace源码底层原理

    这篇文章主要为大家介绍了AsyncGetCallTrace源码的深层原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Spring事务事件监控的实现

    Spring事务事件监控的实现

    这篇文章主要介绍了Spring事务事件监控的实现。本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理。感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 基于Java实现杨辉三角 LeetCode Pascal''s Triangle

    基于Java实现杨辉三角 LeetCode Pascal''s Triangle

    这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
    2016-01-01

最新评论