数仓工具-Hive实战之UDF加密(1)

UDF 加密其实加密或者脱敏是我们使用UDF 非常常见的一种场景,本质上都是为了数据安全,加密例如我们对用户的基本信息加密,脱敏例如我们对用户的手机号码进行脱敏。

常见的加密算法:

Base64 可逆不安全

不是安全领域下的加解密算法,只是一个编码算法;通常用于把二进制数据编码为可写的字符形式的数据,特别适合在http,mime协议下的网络快速传输数据。 UTF-8和GBK中文的Base64编码结果是不同的。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。

MD5 不可逆 安全 散列算法有:MD5、SHA1、HMAC

用途主要用于验证,防止信息被修。具体用途如文件校验、数字签名、鉴权协议

AES 可逆不安全

对称性加密算法有AES、DES、3DES

用途对称加密算法用来对敏感数据等信息进行加密

AES 是一种可逆加密算法,对用户的敏感信息加密处理,对原始数据进行AES加密后,再进行Base64编码转化

Hive自带的加解密函数

hive自带了一些加解密的算法

select base64(cast('abcd' as binary));

select unbase64(base64(cast('abcd' as binary)));

你会发现它是可逆的,也就是我们可以解密出来原始数据

自定义UDF

MD5 UDF

public class MD5Enscript extends UDF {

    //md5+盐(salt)非对称加密
    private static final String SALT = "KGC#kb08@20200511@xxq@chy#=";

    public String evaluate(String pwd) throws IOException {
            // 这里直接使用java 提供的MD5 方法即可
        return DigestUtils.md5Hex(SALT+pwd+SALT);
    }

}
 

Base64 UDF

下面这个是加密函数

public class Base64Encrypt extends UDF {

    public String evaluate(String str) throws UnsupportedEncodingException {
        return Base64.encodeBase64String(str.getBytes("UTF-8"));
    }

}
下面这个是解密函数

public class Base64Decrypt extends UDF {

    public String evaluate(String str) throws UnsupportedEncodingException {
        return new String(Base64.decodeBase64(str));
    }
}
 

AES UDF

public class AESSuper {

    private static final String SALT = "#./*KGC#kb08\\u1009889";
    private static final String ALGORITHM = "AES";
    private static final String CHAR_SET = "UTF-8";
    private static SecretKeySpec sks;
    private static Cipher cipher;

    static {
        try {
            KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
            generator.init(128,new SecureRandom(SALT.getBytes()));
            SecretKey secretKey = generator.generateKey();
            byte[] encoded = secretKey.getEncoded();
            sks = new SecretKeySpec(encoded,ALGORITHM);
            cipher = Cipher.getInstance(ALGORITHM);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static byte[] encrypt(String src) throws Exception{

        cipher.init(Cipher.ENCRYPT_MODE,sks);
        return cipher.doFinal(src.getBytes(CHAR_SET));
    }

    public static byte[] decrypt(byte[] src) throws Exception{
        cipher.init(Cipher.DECRYPT_MODE,sks);
        return cipher.doFinal(src);
    }

}
 

下面是加密算法

public class AESEncrypt extends UDF {

    public String evaluate(String src) throws Exception {

        return Base64.encodeBase64String(AESSuper.encrypt(src));
    }

}
下面是解密算法

public class AESDecrypt extends UDF {

    public String evaluate(String src) throws Exception {
        return new String(AESSuper.decrypt(Base64.decodeBase64(src.getBytes())));
    }

}
总结

1、加密或者脱敏是我们使用UDF非常常用的一种场景,但是这类的UDF却很简单,不复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值