一、背景

在实际应用中,对数据库中的信用卡号、身份证号等敏感数据进行加密是非要有必要的,然而使用传统的分组密码通常会扩展数据,使数据长度和类型发送变化,需要修改数据库结构或应用程序来适应这些变化,成本非常高。为了解决这类问题,期望出现加密后的密文和加密前的明文格式一致(长度和字符类型一样)的加密算法,也就是本文要提到的FPE(format-preserving encryption)算法。

FPE算法的初衷是为了解决数据库或者应用系统中敏感数据的加密问题,随着研究的进展,其应用并不仅限于此,比如FPE可以应用于数据遮蔽(data masking)领域,通过克隆原始数据进行掩码转换,输出一个与元数据格式、关联一模一样的数据,用于解决从生产环境的数据向测试环境(或者开发环境)导入时可能产生的数据内容、数据安全问题,此外,FPE对于网络数据安全一样有用,可以使数据报在不改变格式的情况下在传输过程中受到保护。

二、特征

1、数据不能被扩充. 例如当加密N位的数字时,必须输出另外一个N位的数字

2、数据类型不能被改变. 例如一个只包含数字的串加密后输出的串也只能是数字

3、数据必须能被确定性加密.例如对于数据库中作为主键或者索引字段的数据,被加密后将保留其所在的列作为主键或者索引的特性

三、构建方法

学术界关于格式保留加密的研究已持续多年,2002年,Black和Rogaway提出了3种FPE构建方法:

1、 Prefix

2、Cycle-Walking

3、Generalized-Feistel

这三种方法成为构造FPE模型的基本方法,其中Generalized-Feistel方法的适用性更为广泛,其核心思路是基于Feistel网络来构建符合整数集大小的分组密码,并结合Cycle-Walking方法使最终密文输出在合理范围内,Feistel网络可以通过定义分组大小、密钥长度、轮次数、子密钥生成、轮函数等来构造一个分组密码。

具体文献:https://www.docin.com/p-132469640.html

四、实战代码

@UtilityClass
public class FPEncryptionUtils {private static final String SECRET_KEY="yoursecuritypriv";private static final byte[] A_TWEAK_SUFFIX ="yoursecuritypriv".getBytes();private static final Alphabet EXTEND_ALPHABET=new ExtendAlphabet();private static final TextToIntTransformer TEXT_TO_INT_TRANSFORMER = new GenericTransformations(EXTEND_ALPHABET.availableCharacters());private static final IntToTextTransformer INT_TO_TEXT_TRANSFORMER = new GenericTransformations(EXTEND_ALPHABET.availableCharacters());private static final ThreadLocal<FormatPreservingEncryption> SEED_POOL= ThreadLocal.withInitial(() -> FormatPreservingEncryptionBuilder.ff1Implementation().withDomain(new GenericDomain(EXTEND_ALPHABET,TEXT_TO_INT_TRANSFORMER,INT_TO_TEXT_TRANSFORMER)).withDefaultPseudoRandomFunction(SECRET_KEY.getBytes()).withDefaultLengthRange().build());public static String encrypt(String plainText){if(StringUtils.isEmpty(plainText)){return null;}return SEED_POOL.get().encrypt(plainText,A_TWEAK_SUFFIX);}public static String decrypt(String cipherText){if(StringUtils.isEmpty(cipherText)){return null;}return SEED_POOL.get().decrypt(cipherText,A_TWEAK_SUFFIX);}private static class ExtendAlphabet implements Alphabet{private static final char[] NUM_AND_CHARACTER_CHARS = new char[] {'1', '2', '3', '4', '5', '6', '7', '8','9','0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};private static final char[] ONLY_NUM=new char[]{'1', '2', '3', '4', '5', '6', '7', '8','9','0'};        @Overridepublic char[] availableCharacters() {return NUM_AND_CHARACTER_CHARS;}@Overridepublic Integer radix() {return NUM_AND_CHARACTER_CHARS.length;}}
}

五、效果展示

输入:1008611           输出:8415027
输入:18815658640       输出:06207345474
输入:10086CHF11LH      输出:ZJ8VAT6W7WRL

一种保留格式的加密算法FPE相关推荐

  1. ios不能保存png_GIF、JPG、PNG这三种图片格式的区别是什么?今天帮大家科普一下...

    gif是什么意思?JPG是甚么意思?PNG是什么意思?想必这些都是绘画初学者们经常在想的问题吧,就是在自己保存图片的时候,应该保存哪一个图片格式比较好,每一个格式都会有相对应的特点 那么今天老师就在网 ...

  2. 19种音频格式介绍及音质压缩比的比较 1

    19种音频格式介绍及音质压缩比的比较 目录 前言............................................................................ ...

  3. R语言将数据列中的多种日期格式统一变化为一种固定格式实战:使用lubridate包中的parse_date_time函数

    R语言将数据列中的多种日期格式统一变化为一种固定格式实战:使用lubridate包中的parse_date_time函数 目录

  4. postman对象参数null_postman的几种参数格式

    之前一直使用postman来测试网络请求,但几种参数格式傻傻仍分不清楚.直到最近一个项目的时候,在postman使用form-data测试没问题,但在iOS请求后端一直报请求类型错误,所以重新梳理了相 ...

  5. hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较

    在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...

  6. @html.ActionLink的几种参数格式

    原文:@html.ActionLink的几种参数格式 一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是 ...

  7. 有多少种 “图片格式”?

    我们知道,图片格式有很多种,已统计的有:JPG.JPEG.PNG.GIF.BMP.SVG.webp等等 图片格式.图片所占内存 VS 页面加载性能.网站整体性能? 如何选择才有利于页面性能的优化? 哪 ...

  8. 一种增强的md5加密算法

    一种增强的md5加密算法 2008-06-04 16:26:48 标签:加密算法 md5 一种 增强的 [推送到技术圈] 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一种增强的md5加密算法 ...

  9. 突击计划——两种温度格式的转换

    题目:两种温度格式的转换 #include <stdio.h> //两种温度格式的转换 /* 根据华氏和摄氏温度定义,利用转换公式如下: C=(F-32)/1.8 F=C*1.8+32 * ...

最新文章

  1. Laravel-5.1 ---- 将mews captcha整合到项目中!
  2. RHEL6入门系列之十一,内/外部命令、重定向、管道
  3. 【BZOJ】2655: calc 动态规划+拉格朗日插值
  4. NSString 字符串 操作 常用
  5. VMware Workstation与VMware vSphere的区别
  6. 程序显示文本框_【教程】TestComplete测试桌面应用程序教程(二)
  7. 前端学习(2675):vue3.0学习建议
  8. Div+CSS布局入门教程(五) 页面制作-用好border和clear 附加:1.DIV+CSS设计原则 2.DIV+CSS中标签ul ol li dl dt dd用法
  9. 数据库流行度9月排行榜:Oracle 的老骥伏枥和 MongoDB 逆风飞扬
  10. 高强度的加密软件怎么制作
  11. Liferay教程– Liferay门户Portlet教程
  12. 微信小程序优购商城项目总结
  13. Verilog除法器的设计总结
  14. Diverse Team(暴力)
  15. LaTeX 文字对齐
  16. 基于OpenCV的卡尔曼滤波的设计
  17. Cubase中MIDI设备的如何添加面板
  18. 考考你的眼力 又一张神奇的图片
  19. 调用招商银行接口(手把手教程,附调用接口工具类)
  20. 商城App接入快递100

热门文章

  1. java8高级应用与开发课件和贯穿案例(全)分享
  2. echart ——正负条形图
  3. HTML5期末大作业:动漫人物介绍网站设计——哆啦A梦(5页) HTML+CSS+JavaScript 学生动漫网页设计模板下载 哆啦A大学生HTML网页制作作品 简单漫画网页设计成品...
  4. 工程制图 ( 制图的基本知识和基本技能)
  5. SAP-MM知识精解-自动科目记账(04-2)- 业务事物之“科目分组代码”的影响
  6. 数学小白的探索-欧拉和费马
  7. Android不同手机屏幕分辨率自适应
  8. 蜜雪冰城23年创业史:关门3次,被拆4次,创始人被弟弟怼出局
  9. 程序员能成为自由职业者吗?
  10. PROCAST-重力铸造分析流程