精华内容
下载资源
问答
  • 属性加密代码
    2022-07-26 17:21:36

    1、仿真论文:Ciphertext-Policy Attribute-Based Encryption

    2、使用库:JPBC + lombok

    3、目录结构:

    在这里插入图片描述

    3.1 essay:论文
    3.2 lib:jpbc库
    3.3 params:椭圆曲线参数
    3.4 src:源码
    1. attribute:属性对象
    2. engine:属性基加密引擎,完成encrypt、decrypt、keyGen工作
    3. polynomial:封装的多项式对象
    4. structure:访问树结构
    5. test:测试类
    6. text:明文和密文对象
    7. util:工具类

    4、如何使用

    根据test包下的Text.class类中getAccessTree()方法样例,构建访问树结构,然后依照test1()方法依此进行加解密

    5、github地址

    https://github.com/lengnu/CP-ABE 有用的话就给个star哦

    更多相关内容
  • 一种基于属性的加密方法的实现,CPABE属性加密源码,由JAVA实现
  • 基于属性加密,实现每个关键词密文能够被多个用户私钥搜索,显著降低细粒度访问控制带来的网络带宽和发送节点的处理开销。基于多项式方程,支持对关键词的任意连接搜索,显著提高连接搜索的灵活性。对方案的性能进行...
  • 与对称密码体制相比,公钥密码体制加密密钥(公钥)和解密密钥(私钥)是不一样的,加密密钥是可以公开的,并且不会危及密码算法的安全性。其过程可以简单的表示如下图所示: 如上图所示,其步骤如下所示: Bob...

    1.公钥加密体制:

    与对称密码体制相比,公钥密码体制加密密钥(公钥)和解密密钥(私钥)是不一样的,加密密钥是可以公开的,并且不会危及密码算法的安全性。其过程可以简单的表示如下图所示:

    如上图所示,其步骤如下所示:

    • Bob拥有密钥对K1与K2,一个密钥(K1)用于封箱,另一个密钥(K2)用于开锁;
    • Bob可以将锁与钥匙K1发给任何人(如Alice),使其可以安全地向Bob发消息。
    • Bob 请求发送方(如Alice)用这个锁与钥匙K1封锁内容;
    • 然后Bob可以用密钥K2开锁。

    2.基于身份的加密:

    公钥加密体制虽然具有很好的安全性,但是存在一个最大的问题就是,每个人的公钥都是无意义的一串类似随机数的字符串,如果在加密过程中公钥使用错误,密文就不能被正确的接收者所解密。同时,这很可能就将信息透露给了错误的用户,甚至透露给恶意用户。现实生活中确实存在这样的攻击方法:恶意用户欺骗加密者,将接收者的公钥替换为自己的公钥并告知加密者。

    解决这个方法是引入了一个可信的第三方。第三方维护一个大的表格,表格中存放各个用户的身份,以及其所对应的公钥信息。加密者可以在加密之前首先向可信第三方进行公钥查询,这就可以正确进行加密了。这种解决方法虽然好,但是也有一个问题:当用户数量过多,这个表格的维护就变得很困难。

    所以在1984年,Shamir提出了身份基密码体制的思想(Identity-Based Cryptosystem),该方案基于公钥密码系统,但有一个变化:用户选择他的名字和网络地址(也可以使用姓名、社会保险号、街道地址、办公室号码或电话号码的任意组合,前提是它能唯一标识用户)作为他的公钥,而不是生成一对随机的公钥和私钥,并发布这些密钥中的一个。

    基于身份的方案类似于理想的邮件系统:如果知道某人的姓名和地址,就可以向他发送只有他能阅读的消息,并且可以验证只有他才能提供的签名。其步骤简括如下:

    • 当用户A想要向用户B发送消息时,A使用智能卡中的密钥对消息进行签名,使用B的姓名和网络地址对结果进行加密;
    • A将自己的姓名和网络地址添加到消息中,然后将消息发送给B;
    • 当B收到消息是,他使用智能卡中的密钥对消息进行解密;
    • 然后使用发送者的姓名和网络地址作为验证密钥来验证签名。

    3.基于属性的加密:

    2006年,Goyal V, Pandey A, Sahai A, Waters B在the 13th ACM Conf. on Computer and Communications Security会议上提出了基于属性加密的概念, Sahai A, Waters B提出了第一个基于属性加密方案。其概念如下图所示:

    数据拥有者需要制定一条仅有这n个用户才能满足的访问策略,接着输入公共参数PP、该条策略以及明文文件至ABE加密算法,进行加密一次,形成唯一一份密文。得到密文后,数据拥有者将该份密文分别发送给n个不同的用户。

    ABE的思想源于基于身份的加密,ABE的基本方案有两个,分别如下:

    3.1 KP-ABE方案

     KP-ABE(Key Policy Attribute-based Encryption,基于密钥策略的属性加密)方案是将策略嵌入到密钥中,属性嵌入到密文中,包含一下四个算法:

    • Setup(\gamma ,U):以安全参数\gamma和属性全集U作为输入,初始化系统并生成系统公共参数pk及主密钥mk;
    • KeyGen(pk,mk,T):以系统公共参数pk、主密钥mk以及用户的访问策略T为输入,输出与T对应的用户私钥SK_{T}
    • Encrypt(pk, w,m):以系统公共参数pk、属性集合w以及明文m为输入,输出密文CT_{w}
    • Decrypt(pk,SK_{T},CT_{w}):以系统公共参数pk、用户私钥SK_{T}及密文CT_{w}为输入,当且仅当CT_{w}对应的属性集合w满足SK_{T}对应的访问控制策略T时,算法输出明文m。 

    3.2 CP-ABE 

     CP-ABE(Ciphertext Policy Attribute-based Encryption,基于密文策略的属性加密)方案和KP-ABE方案相似是将策略嵌入到密文中,属性嵌入到密钥中,包含一下四个算法:

    • Setup(\gamma ,U):以安全参数\gamma和属性全集U作为输入,输出系统公共参数pk及主密钥mk;
    • KeyGen(pk,mk,w):输入系统公共参数pk、主密钥mk以及用户属性集合w,输出与w对应的用户私钥SK_{w}
    • Encrypt(pk, T,m):以系统公共参数pk、访问控制策略T以及明文m为输入,输出密文CT_{T}
    • Decrypt(pk,SK_{w},CT_{T}):以系统公共参数pk、用户私钥SK_{w}及密文CT_{T}为输入,当且仅当SK_{w}对应的属性集合w满足CT_{T}对应的访问控制策略T时,输出明文m。
    展开全文
  • 多机构属性加密方案非常适用于云存储环境下的数据访问控制。然而,高效的用户撤销仍是其中一个具有挑战的问题,这妨碍了多机构属性加密的实际应用。针对此问题,在素数阶群中提出一种支持高效撤销的多机构密文策略...
  • cpabe JAVA代码,Java Pairing Based Cryptography Library(jPBC) 1.2.1
  • 针对云存储中数据机密性问题,为解决密钥泄漏与属性撤销问题,从数据的机密性存储以及访问的不可区分性两个方面设计了基于密文策略属性加密体制(CP_ABE)的匿名云存储隐私保护方案。提出了关于密钥泄漏的前向安全的不...
  • 基于属性加密技术

    千次阅读 2020-12-28 10:49:51
    如果数据所有者将数据使用自己的秘钥加密后在链上存证后,能实现数据的隐私保护,但是不能安全的共享给他人。 比如在金融领域,数据上链可以提高数据本身的安全性,也有利于监管机构从区块链中调取数据进行监管,...

    1.背景
    区块链典型的一个应用场景是资源共享,而在实际应用中,很多参与者的数据很涉及机密,数据所有者并不乐意把自己的数据公开出来。数据明文在链上存证后,虽然共享给其他人,但是数据被所有的人都能查看,不存在一点私密性。如果数据所有者将数据使用自己的秘钥加密后在链上存证后,能实现数据的隐私保护,但是不能安全的共享给他人。

    比如在金融领域,数据上链可以提高数据本身的安全性,也有利于监管机构从区块链中调取数据进行监管,但是为什么金融领域的区块链应用迟迟推进不下去呢?一个亟待解决的重要问题是,金融公司本身不愿意将数据存在链上。因为这些数据都是相当敏感且重要的,一旦数据外泄,会带来不小的损失。

    2.基于属性的加密技术

    2.1相关概念

    2.1.1属性

    在ABE中,属性也有着相似的作用。举个例子,JackyLi是A大学信息安全学院的教授,那么“A大学”,“信息安全学院”以及“教授”就是ABE中刻画JackyLi这个人的多个属性,这些属性可以构成一个属性集合,我们可以把它记为集合C_Jacky_Li。

    2.1.2策略

    一种简单的理解是策略实际即是由属性及它们间关系所组成的一个逻辑表达式。例如下式Policy:

    参与X课题or(信息安全学院andA大学and教授)

    这是一条简单的策略,其表达的含义是唯有X课题组的成员或是A大学信息安全学院的教授才能满足其要求。

    2.1.3属性集合与策略匹配

    使用C_Jacky_Li与Policy1进行说明。C_Jacky_Li集合中没有“参与X课题”这一属性,故其无法满足策略的前半部分;而策略的后半部分,要求“信息安全学院”、“A大学”、“教授”这三个属性同时出现,而C_Jacky_Li同时包含了这三个属性,所以属性集合匹配策略后半部分,由于策略前后两部分是or的关系,故属性集合C_Jacky_Li能够满足策略Policy1,我们称之为属性集合与策略匹配成功。

    倘若此时另一个用户Johnson,他的属性集合是C_Johnson={计算机学院,A大学,教授},显然C_Johnson无法满足Policy1,此时属性集合与策略匹配失败。

    2.4 ABE

    一种基于属性加密技术(Attribute-Based Encryption,ABE),通过合理的配置共享策略,即可解决上述私密数据共享问题。根据嵌入的对象不同,ABE可划分为KP-ABE、CP-ABE。

    以CP-ABE为例,举一个简单的例子说明ABE相较传统公钥加密算法的优势。

    一个数据拥有者需要将一份明文文件,加密发送给N个不同的用户,倘若使用传统公钥加密算法,数据拥有者需要首先保存这N个用户的公钥(不考虑公钥证书的情况下),利用这N个不同公钥,使用该份明文文件,加密N次,形成N份不同的密文,分别发送给这个N个用户。PK:Public Key,公钥;CT:Cipher Text,密文。

    若使用ABE来完成这项任务则会轻松很多。此时,数据拥有者只需要制定一条仅有这N个用户才能满足的访问策略,接着输入公共参数PP、该条策略以及明文文件至ABE加密算法,进行加密一次,形成唯一一份密文。得到密文后,数据拥有者将该份密文分别发送给这N个不同用户。

    从加密计算开销与存储开销的角度来看,ABE在该场景下(数据加密共享场景)相较于传统公钥加密算法,有着肉眼可见的性能优势。

    2.4.1 KP-ABE

    KP-ABE(基于密钥策略的属性加密,Key-Policy ABE,KP-ABE)是将策略嵌入到用户密钥中,属性嵌入到密文中。密钥对应于一个访问结构而密文对应于一个属性集合,解密当且仅当属性集合中的属性能够满足此访问策略。这种设计比较接近静态场景,此时密文用与其相关的属性加密存放在服务器上,当允许用户得到某些消息时,就分配一个特定的访问策略给用户,其应用场景则更加偏向于付费视频网站、日志加密管理等等。如果用户想解密多个文件,那么他必须拥有多个可以满足匹配的秘钥,否则不能解密多个文件。

    2.4.2 CP-ABE

    CP-ABE(基于密文策略的属性加密,Ciphertext-Policy ABE,CP-ABE)是将策略嵌入到密文中,属性嵌入到用户密钥中。密文对应于一个访问结构而密钥对应于一个属性集合,解密当且仅当属性集合中的属性能够满足此访问结构。

    CP-ABE基于属性的加密运用密码机制保护数据,由数据拥有者规定访问密文的策略,将属性集合与访问资源相关联,数据使用者可以根据自己的授权属性的访问密文信息,该技术适合隐私数据共享等访问类应用。

    CP-ABE由于策略嵌入密文中,这就意味着数据拥有者可以通过设定策略去决定拥有哪些属性的人能够访问这份密文,也就相当于对这份数据做了一个粒度可以细化到属性级别的加密访问控制,CP-ABE的应用场景一般是公有云上的数据加密存储与细粒度共享。

    2.3 KP-ABE与CP-ABE比较

    在这里插入图片描述

    2.支持用户属性可撤销和恢复的CP-ABE算法实现步骤

    CP-ABE主要由7个步骤组成,前两步均在证书颁发中心(CA)执行,并存储PK\MK\UK:

    初始化Setup:初始化算法为随机化算法,初始化仅生成系统公钥PK、系统主秘钥MSK。
    撤销机构初始化:输入参数为PK,生成一个素数域P,为每个属性att计算list=1。算法输出初始化的P,map<userGID,prime>及map<att,list>,list并不是我们常见的list,而是一个大数,且为素数,用来记录是否被撤销。
    秘钥生成KeyGen:可信授权中心根据PK、MK和数据请求者提交的属性集合S,为数据请求者生成与属性集合关联的用户秘钥UK。在素数域中为用户申请一个素数prime,从P中删除这个prime,保证不同用户获取的prime不一样,然后素数存入映射表map<userGID,prime>中。
    加密Encrypt:加密算法(随机化算法)输入参数为PK、待加密消息M、访问策略关联的访问控制结构,输出基于属性加密的密文。
    解密Decrypt:解密为确定化算法,由数据请求者执行。解密分为两个步骤,第一步:访问策略树的叶子节点,令i=att(x),x表示密文策略访问树的叶子节点,(函数att(x)返回节点x所对应的属性),如果i∈S,算法获取该属性对应的撤销列表list并取模list%prime。若值不为0,表明该用户未被撤销,若为0,表示已被撤销,解密结束;第二步:当第一步验证通过后,算法输入UK、密文M,如果属性集合满足访问策略,算法可成功解密密文M。
    用户属性撤销:算法输入参数为属性att,属性对应的撤销列表list、用户user及用户对应的素数prime。当用户user被撤销属性att时,DO分别从映射表map<user,prime>和map<att,list>取出用户对应的素数prime及属性对应的撤销列表list,并计算list’=list×prime。属性att对应的撤销列表更新为list’。
    用户属性恢复:算法输入参数为属性att,属性对应的撤销列表list、用户user及用户对应的素数prime。用户被撤销可能是暂时的,当用户user重新拥有属性att时,DO分别从映射表map<user,prime>和map<att,list>取出用户对应的素数prime及属性对应的撤销列表list,并计算list’=list÷prime。属性att对应的撤销列表更新为list’。

    2.1用户和秘钥管理

    2.1.1用户管理

    用户拥有的基本信息(最小数据集合):GID(CA提供或业务方提供,但要保证全局唯一性)、CP-ABE用户属性(业务方提供)、唯一素数(CA用户注册单元提供)、私钥(CA用户私钥生成单元产生)。

    用户提交信息(GID、CP-ABE用户属性、唯一素数)到CA,申请注册和生成用户私钥,用户私钥存在CA中,CA提供接口查询用户和用户私钥获取。

    2.1.2策略更改

    在实际工程应用中,撤销方案尽量选择复杂度低、计算开销小、实现简单的方案。因此,本设计中采用的策略撤销方案:通过固定长度的撤销列表记录撤销用户,撤销过程不必更新系统及相关用户的秘钥,可大大降低撤销所引起的计算开销。

    2.1.3撤销

    用户属性撤销:算法输入参数为属性att,属性对应的撤销列表list、用户user及用户对应的素数prime。当用户user被撤销属性att时,DO分别从映射表map<user,prime>和map<att,list>取出用户对应的素数prime及属性对应的撤销列表list,并计算list’=list×prime。属性att对应的撤销列表更新为list’。

    2.1.4恢复

    用户属性恢复:算法输入参数为属性att,属性对应的撤销列表list、用户user及用户对应的素数prime。用户被撤销可能是暂时的,当用户user重新拥有属性att时,DO分别从映射表map<user,prime>和map<att,list>取出用户对应的素数prime及属性对应的撤销列表list,并计算list’=list÷prime。属性att对应的撤销列表更新为list’。

    3.安全性分析

    已有大量学者对其研究证明是安全的,此处安全分析略。

    4.方案优势

    实现了加密数据的细粒度访问控制,即数据拥有者可以指定谁可以访问加密的数据,数据拥有者对数据具有完全的控制权。例如,金融公司自身可以控制谁能对数据进行访问,只需要把数据访问的权限交给监管机构和与之有数据合作的伙伴即可。
    CP-ABE不需要像其它加密方式那样,如非对称加密,每次加密都必须知道接收者的身份信息且发送给多个用户时必须加密多次,CP-ABE只需要设置访问策略仅执行一次加密,当用户拥有的属性符合加密者所描述的策略时,数据使用者就可以解密。
    可解决对称加密密钥传输带来的密钥泄露的问题,保护了数据拥有者信息,也保护了数据使用者信息。

    5.潜在的应用场景

    区块链技术与开放银行的构建

    6.CP-ABE算法Java实现

    可参考以下两个开源项目实现,但是不包括访问策略更改,这一点需要自己实现。
    https://github.com/stefano81/dcpabe
    https://github.com/TU-Berlin-SNET/jTR-ABE

    展开全文
  • 因此, 本文提出了基于属性的可搜索加密属性更新, 它是将基于属性加密方案和关键字搜索加密方案相结合. 该方案支持用户属性更新, 不合法车辆用户不会对存储的数据有访问权限, 从而实现对不合法车辆用户的撤销. ...
  • 对在电子政务中应用属性加密机制实现访问控制进行研究,结合电子政务已...通过实验验证,基于属性加密实现访问控制,克服现有访问控制机制对服务器的安全依赖,并且弥补了对称密码加密保护信息在灵活性和细粒度方面的不足。
  • 在Brakerski等提出的基于LWE问题的属性加密体制基础上,提出了一个基于RLWE问题的属性加密体制。相比基于LWE问题的属性加密体制,该体制效率更高、密钥尺寸更小。在RLWE的安全性假设下,该体制支持长度不受限制的...
  • 通过对共享密钥采用密文策略属性加密机制,实现细粒度访问控制。结合以太坊区块链技术,解决半诚实且好奇的云服务器模型下返回搜索结果不正确的问题,在按需付费的云环境下,实现用户和云服务器之间服务-支付公平,...
  • 传统的属性加密方案中存在着访问策略所包含的属性会泄露用户的敏感信息以及恶意用户泄露私钥获取非法利益而不会被追责的问题。同时私钥长度、密文长度和解密运算量均会随属性数量增加而带来较大的通信开销和计算...
  • SpringBoot配置文件中密码属性加密

    千次阅读 2022-01-27 22:29:20
    SpringBoot配置文件中密码属性加密 本文主要介绍了SpringBoot配置文件中的明文密码如何加密保存,读取以及对于自定义的加密算法加密的参数如何保存和读取。 背景 为了安全的需要,一些重要的信息比如数据库密码不能...

    SpringBoot配置文件中密码属性加密

    本文主要介绍了SpringBoot配置文件中的明文密码如何加密保存,读取以及对于自定义的加密算法加密的参数如何保存和读取。

    背景

    为了安全的需要,一些重要的信息比如数据库密码不能明文保存在配置文件中,需要进行加密之后再保存。SpringBoot可以使用jasypt-spring-boot这个组件来为配置属性提供加密的支持。

    集成jasypt-spring-boot到项目中

    根据官方README文档,可以有三种方式集成jasypt-spring-boot到项目中。

    1. 对于SpringBoot项目,直接通过引入jasypt-spring-boot-starter,然后所有的application.properties, application-*.properties, yaml的配置文件中就可以包含加密的属性。

      <dependency>
      	<groupId>com.github.ulisesbocchio</groupId>
      	<artifactId>jasypt-spring-boot-starter</artifactId>
      	<version>3.0.4</version>
      </dependency>
      
    2. 直接引入jasypt-spring-boot,这时候需要在启动类上添加一个@EnableEncryptableProperties,然后在配置文件中可以包含有加密的字段属性。

      @SpringBootApplication
      @EnableEncryptableProperties
      public class Application {
          ...
      }
      
    3. 如果不想要整个Spring的配置文件都启用加密的字段属性,还可以自己指定对应加密的配置文件路径。也需要引入jasypt-spring-boot,同时在启动类上添加@EncryptablePropertySource注解,设置注解的value属性为需要读取的加密配置文件路径。

      @SpringBootApplication
      @EncryptablePropertySource({"classpath:encrypted.properties"})
      public class Application {
          ...
      }
      

    配置文件配置加密与读取

    现在知道了如何集成jasypt-spring-boot到项目中,下面就介绍一下如何加密明文的密码,以及需要如何存储在配置文件中。

    1. 首先,需要添加一个maven的插件,这个插件可以帮助我们加密我们需要的明文信息。

      <plugin>
      	<groupId>com.github.ulisesbocchio</groupId>
      	<artifactId>jasypt-maven-plugin</artifactId>
      	<version>3.0.4</version>
      </plugin>
      
    2. 之后,执行如下的mvn命令,可以在控制台得到对于的密文。然后将配置文件中明文替换为加密后的密文。

      mvn jasypt:encrypt-value -Djasypt.encryptor.password="TKzhc3fz" -Djasypt.plugin.value="123456"
      

      -Djasypt.encryptor.password参数指定用于加密密码,我理解这个应该和秘钥类似。

      -Djasypt.plugin.value参数指定需要加密的明文参数。

      执行命令后,可以在控制台看到加密后的密文,密文默认是用ENC()格式包围住的,当然这个格式也可以自定义。
      在这里插入图片描述 也可以通过这个mvn插件解密,执行如下命令,可以在控制台看到解密之后的明文。

      mvn jasypt:decrypt-value -Djasypt.encryptor.password="TKzhc3fz" -Djasypt.plugin.value="ENC(Muhq57xdiHA5jJX9pX7zmNz57w4emX2D/XYIXOMEx0LYcTL7RYyadWe2J7GCi9KJ)"
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0yAVel7B-1643293746247)(/Users/yuanzhihao/Desktop/截屏2022-01-27 下午10.12.53.png)]

    3. 在SpringBoot配置文件中,添加jasypt.encryptor.password属性,这个值和第二步生成密文的值要一样,不然解密会失败。

      jasypt:
        encryptor:
          password: TKzhc3fz # 设置加密的password信息 类似秘钥?
      test:
        password: ENC(Muhq57xdiHA5jJX9pX7zmNz57w4emX2D/XYIXOMEx0LYcTL7RYyadWe2J7GCi9KJ) # 测试数据
      
    4. 这样在主程序启动的时候,通过@Value注解就可以自动解密配置文件中的密文信息了,这样就完成了明文的加密以及后续的读取。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-muDkBMKU-1643293746249)(/Users/yuanzhihao/Desktop/截屏2022-01-27 下午10.14.26.png)]

    工作原理简析

    参照官方文档,大概的工作原理如下:

    首先,在Spring容器启动之后,会遍历配置文件中的所有的配置,然后发现所有按照jasypt约定规则加密的属性,此处就是使用ENC()包围的参数,这个ENC()前缀和后缀是可以自定义的,下面会讲到。

    这边主要是有两个接口,分别是EncryptablePropertyDetector、EncryptablePropertyResolver,这两个接口根据名称可以看出来一个是发现器,一个是分解器。

    先来看EncryptablePropertyDetector这个接口,这个接口提供了两个方法,isEncrypted和unwrapEncryptedValue,isEncrypted方法判断是否是jasypt约定规则加密的属性,unwrapEncryptedValue方法会返回去除掉前缀和后缀的真正加密的值,可以看下该接口默认的实现DefaultPropertyDetector:

    /**
     * Default property detector that detects encrypted property values with the format "$prefix$encrypted_value$suffix"
     * Default values are "ENC(" and ")" respectively.
     *
     * @author Ulises Bocchio
     */
    public class DefaultPropertyDetector implements EncryptablePropertyDetector {
        // 默认的前缀和后缀
        private String prefix = "ENC(";
        private String suffix = ")";
    
        public DefaultPropertyDetector() {
        }
    
        public DefaultPropertyDetector(String prefix, String suffix) {
            Assert.notNull(prefix, "Prefix can't be null");
            Assert.notNull(suffix, "Suffix can't be null");
            this.prefix = prefix;
            this.suffix = suffix;
        }
    
        // 判断配置属性是否是按照jasypt约定规则加密的属性
        @Override
        public boolean isEncrypted(String property) {
            if (property == null) {
                return false;
            }
            final String trimmedValue = property.trim();
            return (trimmedValue.startsWith(prefix) &&
                    trimmedValue.endsWith(suffix));
        }
    
        // 去掉默认的前缀和后缀,返回加密的值
        @Override
        public String unwrapEncryptedValue(String property) {
            return property.substring(
                    prefix.length(),
                    (property.length() - suffix.length()));
        }
    }
    

    EncryptablePropertyResolver这个接口中只提供了一个方法resolvePropertyValue,这个方法会遍历配置文件属性,判断是否是加密属性,然后进行解密返回明文。在默认实现DefaultPropertyResolver中,依赖EncryptablePropertyDetector以及StringEncryptor,真正解密的方法是写在StringEncryptor,这边具体如何解密就不详细描述了,有兴趣可以自行看下。DefaultPropertyResolver类:

    /**
     * @author Ulises Bocchio
     */
    public class DefaultPropertyResolver implements EncryptablePropertyResolver {
    
        private final Environment environment;
        // 加密和解密的实现
        private StringEncryptor encryptor;
        // jasypt默认发现器
        private EncryptablePropertyDetector detector;
    
        public DefaultPropertyResolver(StringEncryptor encryptor, Environment environment) {
            this(encryptor, new DefaultPropertyDetector(), environment);
        }
    
        public DefaultPropertyResolver(StringEncryptor encryptor, EncryptablePropertyDetector detector, Environment environment) {
            this.environment = environment;
            Assert.notNull(encryptor, "String encryptor can't be null");
            Assert.notNull(detector, "Encryptable Property detector can't be null");
            this.encryptor = encryptor;
            this.detector = detector;
        }
    
        @Override
        public String resolvePropertyValue(String value) {
            // 该方法获取加密的属性,然后使用StringEncryptor解密并返回
            return Optional.ofNullable(value)
                    .map(environment::resolvePlaceholders)
                    .filter(detector::isEncrypted) // 过滤加密属性
                    .map(resolvedValue -> {
                        try {
                            // 去除前缀和后缀获取真正加密的值
                            String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());
                            String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);
                            // 解密获得明文
                            return encryptor.decrypt(resolvedProperty);
                        } catch (EncryptionOperationNotPossibleException e) {
                            throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed,  make sure encryption/decryption " +
                                    "passwords match", e);
                        }
                    })
                    .orElse(value);
        }
    }
    

    使用自定义的加密算法

    如果不想要使用jasypt工具中的加密算法,或者内部要求使用某种特定的加密算法,jasypt-spring-boot组件也提供了自定义加解密的实现方式。上面在工作原理简析中提到了两个接口EncryptablePropertyDetector、EncryptablePropertyResolver,我们可以通过自己实现这两个接口的方式,并且指定对应的bean名称为encryptablePropertyDetector和encryptablePropertyResolver来覆盖框架提供的默认实现,完成加密算法和前缀后缀的自定义。

    这边我就用base64加密算法举例,实现自定义的加密算法:

    1. 自己实现EncryptablePropertyDetector、EncryptablePropertyResolver接口,并且交给Spring管理,设置bean名称为encryptablePropertyDetector和encryptablePropertyResolver。

    2. 重写接口对应的方法。

      @Component("encryptablePropertyDetector")
      public class Base64EncryptablePropertyDetector implements EncryptablePropertyDetector {
          private static final String PREFIX = "password:";
      
          @Override
          public boolean isEncrypted(String property) {
              if (property == null) {
                  return false;
              }
              return property.startsWith(PREFIX);
          }
      
          @Override
          public String unwrapEncryptedValue(String property) {
              return property.substring(PREFIX.length());
          }
      }
      
      @Component("encryptablePropertyResolver")
      public class Base64EncryptablePropertyResolver implements EncryptablePropertyResolver {
          @Autowired
          private Base64EncryptablePropertyDetector encryptablePropertyDetector;
      
          @Override
          public String resolvePropertyValue(String value) {
              return Optional.ofNullable(value)
                  .filter(encryptablePropertyDetector::isEncrypted)
                  .map(resolveValue -> {
                      final String unwrapEncryptedValue = encryptablePropertyDetector.unwrapEncryptedValue(resolveValue);
                      return new String(Base64.getDecoder().decode(unwrapEncryptedValue),
                          StandardCharsets.UTF_8);
                  })
                  .orElse(value);
          }
      }
      
    3. 配置文件中的加密属性使用自定义的前缀和后缀。这边明文先使用base64加密,之后加上“password:”前缀:

      jasypt:
        encryptor:
          password: TKzhc3fz # 设置加密的password信息 类似秘钥?
      test:
        password: password:MTIzNDU2 # 测试数据
      
    4. 启动和读取。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYUKAyj1-1643293746250)(/Users/yuanzhihao/Desktop/截屏2022-01-27 下午10.18.27.png)]

    结语

    参考链接:https://github.com/ulisesbocchio/jasypt-spring-boot

    代码地址:https://github.com/yzh19961031/SpringCloudDemo

    展开全文
  • 属性加密(ABE)基础知识

    千次阅读 2022-04-09 21:39:25
    属性加密 最近在看ABE相关论文,因为本人(数学功底一般)不太能理解其中原理。所以特意记录ABE的基础知识,以便日后能快速重温。 ABE常见分类 属性基加密的思想是让密文和密钥与属性集合和访问结构产生关联,当且仅...
  • 属性加密算法

    千次阅读 2020-05-25 19:59:15
    属性加密(Attribute-Based Encryption) 属性加密算法基本上可以分为KP-ABE和CP-ABE。 KP-ABE(key policy) 密钥策略属性加密,在KP-ABE 方案中,用户的解密私钥对应相应的访问控制策略,而密文则和属性集合相关联,...
  • 属性加密技术及基于属性的访问控制技术

    千次阅读 多人点赞 2020-04-07 13:37:10
    一、属性加密技术... 1 1.1基于身份的加密体制简介... 1 1.2基于属性的加密体制的研究背景和意义... 1 1.3基于属性加密的研究现状... 2 二、基于属性的访问控制技术... 5 2.1基于属性的访问控制介绍... 5 2.2...
  • 基于密文策略的权重多中心属性加密方案
  • 1、创建注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) ...2、在属性上加入注解 需要加密的字段 //三个实例类注意 //请求报文 @Data public class FallbackRequestModel implements Seri
  • OpenABE是一个加密库,其中包含各种基于属性加密(ABE)算法,行业标准的加密功能和工具以及直观的应用程序编程接口(API)。 OpenABE旨在允许开发人员将ABE技术无缝集成到受益于ABE的应用程序中,以保护和控制对...
  • 属性加密方案中,加密者通常把访问策略与密文一起发送给用户,但有时访问策略本身就是敏感信息,需要保密。提出一种新的较高效的匿名访问属性加密方案,在加密过程中通过隐藏部分子集值以使授权用户有效密文和...
  • rabe是一个锈库,它使用zcash的bn库的修改版本(类型3配对/ Baretto Naering曲线)实现了几种基于属性加密(ABE)方案。 对bn的修改带来了serde而不是不推荐使用的rustc_serialize 。 这是一个防锈板条箱,带有C...
  • 密文策略的属性加密方案是更接近实现访问控制系统的加密方案,基于c语言实现,亲测在linux上可用。
  • 属性加密作为一种新型的密码方案,将用户私钥和密文与属性相关联,为解决云存储环境下数据安全共享、细粒度访问控制和安全存储等问题提供了一种解决思路。在对密钥策略属性加密、密文策略属性加密和混合策略...
  • 属性加密技术 基于身份的加密体制简介 基于身份的加密体制可以看作一种特殊的公钥加密,它有如下特点:系统中用户的公钥可以由任意的字符串组成。这些字符串可以是用户在现实中的身份信息,如:身份证号码、用户姓名...
  • 密 码 学 原 理 高级密码算法之 属性加密算法 1 问题的提出 C 目O 2 访问控制结构 N T E N T 3 加解密过程 录 1.问题的提出 问题文档加密后只有指定的群体能够解密 财务部门 and 级别>副经理 or 级别=总经理 email=@...
  • 基于属性加密方案(CP-ABE,KP-ABE)

    万次阅读 多人点赞 2020-03-10 21:35:27
    如果数据所有者将数据使用自己的秘钥加密后在链上存证后,能实现数据的隐私保护,但是不能安全的共享给他人。 比如在金融领域,数据上链可以提高数据本身的安全性,也有利于监管机构从区块链中...
  • 密钥策略属性加密(KP-ABE)的出现弥补了这一缺陷,在KP-ABE系统中,密文与一组描述性属性相关联,用户的私钥与一个访问结构相关联,当密文中的属性集满足用户私钥中的访问策略时,密文才能够被解密
  • 设计基于属性的访问控制方案,通过属性描述用户的身份,允许加密数据的主体指定其解密客体,具有较高的效率和更好的安全性。系统采用当今热门的Hadoop开源架构,实现了云环境下的存储、上传、下载等功能,该架构环境...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 206,699
精华内容 82,679
关键字:

属性加密代码