一种保留格式的加密算法FPE
一、背景
在实际应用中,对数据库中的信用卡号、身份证号等敏感数据进行加密是非要有必要的,然而使用传统的分组密码通常会扩展数据,使数据长度和类型发送变化,需要修改数据库结构或应用程序来适应这些变化,成本非常高。为了解决这类问题,期望出现加密后的密文和加密前的明文格式一致(长度和字符类型一样)的加密算法,也就是本文要提到的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相关推荐
- ios不能保存png_GIF、JPG、PNG这三种图片格式的区别是什么?今天帮大家科普一下...
gif是什么意思?JPG是甚么意思?PNG是什么意思?想必这些都是绘画初学者们经常在想的问题吧,就是在自己保存图片的时候,应该保存哪一个图片格式比较好,每一个格式都会有相对应的特点 那么今天老师就在网 ...
- 19种音频格式介绍及音质压缩比的比较 1
19种音频格式介绍及音质压缩比的比较 目录 前言............................................................................ ...
- R语言将数据列中的多种日期格式统一变化为一种固定格式实战:使用lubridate包中的parse_date_time函数
R语言将数据列中的多种日期格式统一变化为一种固定格式实战:使用lubridate包中的parse_date_time函数 目录
- postman对象参数null_postman的几种参数格式
之前一直使用postman来测试网络请求,但几种参数格式傻傻仍分不清楚.直到最近一个项目的时候,在postman使用form-data测试没问题,但在iOS请求后端一直报请求类型错误,所以重新梳理了相 ...
- hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较
在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...
- @html.ActionLink的几种参数格式
原文:@html.ActionLink的几种参数格式 一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是 ...
- 有多少种 “图片格式”?
我们知道,图片格式有很多种,已统计的有:JPG.JPEG.PNG.GIF.BMP.SVG.webp等等 图片格式.图片所占内存 VS 页面加载性能.网站整体性能? 如何选择才有利于页面性能的优化? 哪 ...
- 一种增强的md5加密算法
一种增强的md5加密算法 2008-06-04 16:26:48 标签:加密算法 md5 一种 增强的 [推送到技术圈] 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一种增强的md5加密算法 ...
- 突击计划——两种温度格式的转换
题目:两种温度格式的转换 #include <stdio.h> //两种温度格式的转换 /* 根据华氏和摄氏温度定义,利用转换公式如下: C=(F-32)/1.8 F=C*1.8+32 * ...
最新文章
- Laravel-5.1 ---- 将mews captcha整合到项目中!
- RHEL6入门系列之十一,内/外部命令、重定向、管道
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
- NSString 字符串 操作 常用
- VMware Workstation与VMware vSphere的区别
- 程序显示文本框_【教程】TestComplete测试桌面应用程序教程(二)
- 前端学习(2675):vue3.0学习建议
- Div+CSS布局入门教程(五) 页面制作-用好border和clear 附加:1.DIV+CSS设计原则 2.DIV+CSS中标签ul ol li dl dt dd用法
- 数据库流行度9月排行榜:Oracle 的老骥伏枥和 MongoDB 逆风飞扬
- 高强度的加密软件怎么制作
- Liferay教程– Liferay门户Portlet教程
- 微信小程序优购商城项目总结
- Verilog除法器的设计总结
- Diverse Team(暴力)
- LaTeX 文字对齐
- 基于OpenCV的卡尔曼滤波的设计
- Cubase中MIDI设备的如何添加面板
- 考考你的眼力 又一张神奇的图片
- 调用招商银行接口(手把手教程,附调用接口工具类)
- 商城App接入快递100
热门文章
- java8高级应用与开发课件和贯穿案例(全)分享
- echart ——正负条形图
- HTML5期末大作业:动漫人物介绍网站设计——哆啦A梦(5页) HTML+CSS+JavaScript 学生动漫网页设计模板下载 哆啦A大学生HTML网页制作作品 简单漫画网页设计成品...
- 工程制图 ( 制图的基本知识和基本技能)
- SAP-MM知识精解-自动科目记账(04-2)- 业务事物之“科目分组代码”的影响
- 数学小白的探索-欧拉和费马
- Android不同手机屏幕分辨率自适应
- 蜜雪冰城23年创业史:关门3次,被拆4次,创始人被弟弟怼出局
- 程序员能成为自由职业者吗?
- PROCAST-重力铸造分析流程