北京融安特智能科技营销型网站wordpress archive

news/2025/9/26 13:14:46/文章来源:
北京融安特智能科技营销型网站,wordpress archive,一般网站要多大空间,国外做动运服装的网站目录 对称加密算法 AES #xff08;ECB模式#xff09; AES(CBC 模式)。 非对称加密 对称加密算法 对称加密算法#xff0c;是使用相同的密钥进行加密和解密。使用对称加密算法来加密双方的通信的话#xff0c;双方需要先约定一个密钥#xff0c;加密方才能加密#…目录 对称加密算法 AES ECB模式 AES(CBC 模式)。 非对称加密 对称加密算法 对称加密算法是使用相同的密钥进行加密和解密。使用对称加密算法来加密双方的通信的话双方需要先约定一个密钥加密方才能加密接收方才能 解密。常用的加密算法有 DES、3DES 和 AES国密算法包括SM1SM4和SM7。 目前使用 DES 来加密数据非常不安全。因此在业务代码中要避免使用 DES 加密。而 3DES 算法是使用不同的密钥进行三次 DES 串联调用虽然解决 了 DES 不够安全的问题但是比 AES 慢也不太推荐。我们来看看AES的算法AES 算法有ECB、CBC、 CFB、OFB、CTR 模式 AES ECB模式 private static final String KEY secretkey1234567; //密钥//测试ECB模式GetMapping(ecb)public void ecb() throws Exception {Cipher cipher Cipher.getInstance(AES/ECB/NoPadding);test(cipher, null);}//获取加密秘钥帮助方法private static SecretKeySpec setKey(String secret) {return new SecretKeySpec(secret.getBytes(), AES);}//测试逻辑private static void test(Cipher cipher, AlgorithmParameterSpec parameterSpec) throws Exception {//初始化Ciphercipher.init(Cipher.ENCRYPT_MODE, setKey(KEY), parameterSpec);//加密测试文本System.out.println(一次 Hex.encodeHexString(cipher.doFinal(abcdefghijklmnop.getBytes())));//加密重复一次的测试文本System.out.println(两次 Hex.encodeHexString(cipher.doFinal(abcdefghijklmnopabcdefghijklmnop.getBytes())));//下面测试是否可以通过操纵密文来操纵明文 //发送方账号byte[] sender 1000000000012345.getBytes();//接收方账号byte[] receiver 1000000000034567.getBytes();//转账金额byte[] money 0000000010000000.getBytes();//加密发送方账号System.out.println(发送方账号 Hex.encodeHexString(cipher.doFinal(sender)));//加密接收方账号System.out.println(接收方账号 Hex.encodeHexString(cipher.doFinal(receiver)));//加密金额System.out.println(金额 Hex.encodeHexString(cipher.doFinal(money)));//加密完整的转账信息byte[] result cipher.doFinal(ByteUtils.concatAll(sender, receiver, money));System.out.println(完整数据 Hex.encodeHexString(result));//用于操纵密文的临时字节数组byte[] hack new byte[result.length];//把密文前两段交换System.arraycopy(result, 16, hack, 0, 16);System.arraycopy(result, 0, hack, 16, 16);System.arraycopy(result, 32, hack, 32, 16);cipher.init(Cipher.DECRYPT_MODE, setKey(KEY), parameterSpec);分区 业务常见问题 的第 16 页 cipher.init(Cipher.DECRYPT_MODE, setKey(KEY), parameterSpec);//尝试解密System.out.println(原始明文 new String(ByteUtils.concatAll(sender, receiver, money)));System.out.println(操纵密文 new String(cipher.doFinal(hack)));} 两个相同明文分组产生的密文就是两个相同的密文分组叠在一起。在不知道密钥的情况下我们操纵密文实现了对明文数据的修改对调了发送方账号 和接收方账号。所以说ECB 模式虽然简单但是不安全不推荐使用。 AES(CBC 模式)。 private static final String initVector abcdefghijklmnop; //初始化向量 GetMapping(cbc) public void cbc() throws Exception {Cipher cipher Cipher.getInstance(AES/CBC/NoPadding);IvParameterSpec iv new IvParameterSpec(initVector.getBytes(UTF-8));test(cipher, iv); }可以看到相同的明文字符串复制一遍得到的密文并不是重复两个密文分组并且调换密文分组的顺序无法操纵明文。 不要在代码中写死一个固定的密钥和初始化向量最好和之前提到的盐一样是唯一、独立并且每次都变化的。推荐使用独立的加密服务来管控密钥、做 加密操作千万不要把密钥和密文存在一个数据库加密服务需要设置非常高的管控标准。数据库中不能保存明文的敏感信息但可以保存脱敏的信息。 普通查询的时候直接查脱敏信息即可。下面举个例子 Data Entity public class UserData {Idprivate Long id;private String idcard;//脱敏的身份证private Long idcardCipherId;//身份证加密IDprivate String idcardCipherText;//身份证密文private String name;//脱敏的姓名private Long nameCipherId;//姓名加密IDprivate String nameCipherText;//姓名密文 } Data Entity public class CipherData {IdGeneratedValue(strategy AUTO)private Long id;private String iv;//初始化向量private String secureKey;//密钥 } 加密服务使用 GCM 模式 Galois/Counter Mode的 AES-256 对称加密算法也就是 AES-256-GCM这是一种AEADAuthenticated Encryption with Associated Data认证加密算法除了能实现普通加密算法提供的保密性之外还能实现可认证性和密文完整性是目前最推荐的 AES 模式。使用类似 GCM 的 AEAD 算法进行加解密除了需要提供初始化向量和密钥之外还可以提供一个 AAD附加认证数据additional authenticated data用于验证未 包含在明文中的附加信息解密时不使用加密时的 AAD 将解密失败。其实GCM 模式的内部使用的就是 CTR 模式只不过还使用了 GMAC 签名算法对 密文进行签名实现完整性校验。 我们实现基于 AES-256-GCM 的加密服务包含下面的主要逻辑加密时允许外部传入一个 AAD 用于认证加密服务每次都会使用新生成的随机值作为密 钥和初始化向量。在加密后加密服务密钥和初始化向量保存到数据库中返回加密 ID 作为本次加密的标识。应用解密时需要提供加密 ID、密文和加 密时的 AAD 来解密。加密服务使用加密 ID从数据库查询出密钥和初始化向量。 Service public class CipherService {//密钥长度public static final int AES_KEY_SIZE 256;//初始化向量长度public static final int GCM_IV_LENGTH 12;//GCM身份认证Tag长度public static final int GCM_TAG_LENGTH 16;Autowiredprivate CipherRepository cipherRepository;//内部加密方法public static byte[] doEncrypt(byte[] plaintext, SecretKey key, byte[] iv, byte[] aad) throws Exception {//加密算法Cipher cipher Cipher.getInstance(AES/GCM/NoPadding);//Key规范SecretKeySpec keySpec new SecretKeySpec(key.getEncoded(), AES);//GCM参数规范GCMParameterSpec gcmParameterSpec new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);//加密模式cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmParameterSpec);//设置aadif (aad ! null)cipher.updateAAD(aad);//加密byte[] cipherText cipher.doFinal(plaintext);return cipherText;}//内部解密方法public static String doDecrypt(byte[] cipherText, SecretKey key, byte[] iv, byte[] aad) throws Exception {//加密算法Cipher cipher Cipher.getInstance(AES/GCM/NoPadding);//Key规范SecretKeySpec keySpec new SecretKeySpec(key.getEncoded(), AES);//GCM参数规范GCMParameterSpec gcmParameterSpec new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);//解密模式cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);//设置aadif (aad ! null)cipher.updateAAD(aad);//解密byte[] decryptedText cipher.doFinal(cipherText);return new String(decryptedText);}//加密入口public CipherResult encrypt(String data, String aad) throws Exception {//加密结果CipherResult encryptResult new CipherResult();//密钥生成器KeyGenerator keyGenerator KeyGenerator.getInstance(AES);//生成密钥keyGenerator.init(AES_KEY_SIZE);SecretKey key keyGenerator.generateKey();//IV数据byte[] iv new byte[GCM_IV_LENGTH];//随机生成IVSecureRandom random new SecureRandom();random.nextBytes(iv);//处理aadbyte[] aaddata null;if (!StringUtils.isEmpty(aad))aaddata aad.getBytes();aaddata aad.getBytes();//获得密文encryptResult.setCipherText(Base64.getEncoder().encodeToString(doEncrypt(data.getBytes(), key, iv, aaddata)));//加密上下文数据CipherData cipherData new CipherData();//保存IVcipherData.setIv(Base64.getEncoder().encodeToString(iv));//保存密钥cipherData.setSecureKey(Base64.getEncoder().encodeToString(key.getEncoded()));cipherRepository.save(cipherData);//返回本地加密IDencryptResult.setId(cipherData.getId());return encryptResult;}//解密入口public String decrypt(long cipherId, String cipherText, String aad) throws Exception {//使用加密ID找到加密上下文数据CipherData cipherData cipherRepository.findById(cipherId).orElseThrow(() - new IllegalArgumentException(invlaid cipherId));//加载密钥byte[] decodedKey Base64.getDecoder().decode(cipherData.getSecureKey());//初始化密钥SecretKey originalKey new SecretKeySpec(decodedKey, 0, decodedKey.length, AES);//加载IVbyte[] decodedIv Base64.getDecoder().decode(cipherData.getIv());//处理aadbyte[] aaddata null;if (!StringUtils.isEmpty(aad))aaddata aad.getBytes();//解密return doDecrypt(Base64.getDecoder().decode(cipherText.getBytes()), originalKey, decodedIv, aaddata);} }我们可以让用户选择如果需要保护二要素的话就自己输入一个查询密码作为 AAD。系统需要读取用户敏感信息的时候还需要用户提供这个密码否 则无法解密。这样一来即使黑客拿到了用户数据库的密文、加密服务的密钥和 IV也会因为缺少 AAD 无法解密。 Autowiredprivate CipherService cipherService;//加密GetMapping(right)public UserData right(RequestParam(value name, defaultValue test) String name,RequestParam(value idcard, defaultValue 300000000000001234) String idCard,RequestParam(value aad, required false)String aad) throws Exception {UserData userData new UserData();userData.setId(1L);//脱敏姓名userData.setName(chineseName(name));//脱敏身份证userData.setIdcard(idCard(idCard));//加密姓名CipherResult cipherResultName cipherService.encrypt(name,aad);userData.setNameCipherId(cipherResultName.getId());userData.setNameCipherText(cipherResultName.getCipherText());//加密身份证CipherResult cipherResultIdCard cipherService.encrypt(idCard,aad);userData.setIdcardCipherId(cipherResultIdCard.getId());userData.setIdcardCipherText(cipherResultIdCard.getCipherText());return userRepository.save(userData);}//解密GetMapping(read)public void read(RequestParam(value aad, required false)String aad) throws Exception {//查询用户信息UserData userData userRepository.findById(1L).get();//使用AAD来解密姓名和身份证log.info(name : {} idcard : {},log.info(name : {} idcard : {},cipherService.decrypt(userData.getNameCipherId(), userData.getNameCipherText(),aad),cipherService.decrypt(userData.getIdcardCipherId(), userData.getIdcardCipherText(),aad));}//脱敏身份证private static String idCard(String idCard) {String num StringUtils.right(idCard, 4);return StringUtils.leftPad(num, StringUtils.length(idCard), *);}//脱敏姓名public static String chineseName(String chineseName) {String name StringUtils.left(chineseName, 1);return StringUtils.rightPad(name, StringUtils.length(chineseName), *); {id:1,name:朱*,idcard:************** 1234,idcardCipherId:26346,idcardCipherText:t/wIh1XTj00wJP1Lt3aGzSvn9GcqQWEwthN58KKU4KZ4Tw,nameCipherId:26347,name CipherText:gHrk1 mWmveBMVUoCYon8Zjj9QAtw} [21:46:00.079] [http-nio-45678-exec-6] [INFO ] [o.g.t.c.s.s.StoreIdCardController:102 ] - name : test idcard : 300000000000001234 错误的aad会抛出异常 javax.crypto.AEADBadTagException: Tag mismatch! at com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:578) at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1116) at com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1053) at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853) at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446) at javax.crypto.Cipher.doFinal(Cipher.java:2164) 非对称加密 公钥密码算法。公钥密码是由一对密钥对构成的使用公钥或者说加密密钥来加密使用私钥或者说解密密钥来解密公钥可以任意公开私钥不能公 开。使用非对称加密的话通信双方可以仅分享公钥用于加密加密后的数据没有私钥无法解密国密算法包括SM2SM9。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全景网站制作教程现在还有做系统的网站吗

1.SELECT语句 从一个表或多个表中检索信息 2.检索单个列 输入: SELECT prod_name FROM Products; 输出: 没有过滤,也没有排序,输出数据顺序可能不同。 3.检索多个列 输入: SELECT prod_id, prod_name, prod_price F…

10.1.1 启用python达成第一个遗传算法

10.1.1 启用python达成第一个遗传算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

[iOS] OC高级编程 - 引用计数 (1) - 详解

[iOS] OC高级编程 - 引用计数 (1) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Docker Docker Compose 完整入门与实用技巧 - 教程

Docker & Docker Compose 完整入门与实用技巧 - 教程2025-09-26 13:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important;…

建网站过程网站制作报价优惠

[html] 说说你对属性data-的理解 data- 属性是H5新增的自定义属性,也可以用来存储值。我个人用的不多,这个data- 属性倒是和vue中的v-bind 功能相似, 自定义属性,绑定数据。也和上面说的一样可以通过js进行获取使用个人简介 我是…

营销型网站建设合同戚墅堰做网站

云原生之使用Docker部署RSS阅读器Huntly 一、Huntly介绍1.1 Huntly简介1.2 Huntly功能2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Huntly镜像五、部署Huntly5.1 创建挂载目录5.2 创建Hun…

达州网站建设的公司怎么自己搭建梯子

最近在练习搭建网站,遇到游览器找不到服务器上的php文件的问题。后来查找发现,apache文档根目录跟apache虚拟主机文档根目录不同,服务器开启了虚拟主机功能。这导致游览器找不到php文件。 使用的环境是LAMP,它 的操作系统和软件版…

西安网站建设公司电话wordpress 删除 评论

事件以及事件相关的兼容性问题 事件最早是在 IE3 和 Navigator2 中出现的,当时是作为分担服务器运算负担的一种手段。要实现和网页的交互,就需要通过 JavaScript 里面的事件来实现。 每次用户与一个网页进行交互,例如点击链接,按下…

网站模板兼容手机端灰色推广引流联系方式

文章目录 📄前言一. Mybatis简介✈️1. 什么是Mybatis🚀2. 为什么使用Mybatis 二. Mybatis快速入门🍆1. mybatis使用前准备1.1 创建springboot项目并引入相关依赖1.2 在 application.ym中进行数据源的配置1.3 创建数据表,准备表数…

杭州网站建设哪个好想创建一个网站

🌼未封装 在项目中往往一个页面存在着要联调好几个接口,此时用下面的写法就会显得代码很冗余 // 向给定ID的用户发起请求 axios.get(/user?ID123456,{ params: { //发送请求的数据ID: 123456 } }) .then(function (response) { // 处理成功情…

网站详情页用什么软件做如何制作自己的网站模版

理解依赖属性 依赖属性支持的特征包括:动画、数据绑定、样式。由WPF元素暴露的属性大部分都是依赖属性。依赖属性和常规属性的使用方法相同。 WPF设计了依赖属性支持其特有的动态特性,并且不干扰其他系统的.net代码。 定义依赖属性 创造一个依赖属性的语…

PySide6 之鼠标事件写字板

一、效果图二、示例代码from PySide6.QtWidgets import * from PySide6.QtCore import * from PySide6.QtGui import * import sysclass ImageWidget(QWidget):pass鼠标控制图片缩放、拖动,鼠标滚动放大、缩小 class …

深入解析:golang基础语法(三)常量、指针、别名、关键字、运算符、字符串类型转换

深入解析:golang基础语法(三)常量、指针、别名、关键字、运算符、字符串类型转换pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

烟台网站建设方案成都市建设局官方网站

目录 一. 空属性null 二. 默认值default 三. 列描述comment 四. 填充零zerofill 五. 主键primary key 六. 自增长auto_increment 七. 唯一键unique 八. 外键foreign key 一. 空属性null 对于表中的数据,如果在进行插入的时候不显示地给定值,那么…

单B细胞技术如何实现兔单抗高通量高特异制备

单B细胞技术如何实现兔单抗高通量高特异制备 在单克隆抗体(mAb)研发领域,兔源单抗以其高亲和力和高特异性备受关注。传统的杂交瘤技术虽然成熟,但周期长、效率低,而且抗体多样性有限。近年来,单B细胞技术的出现,…

HP激光墨盒换墨粉

墨盒分区加墨是先清理使用过的墨粉,在加入要使用的墨粉。 清理使用过的墨粉 可拆开使用过的墨粉的墨盒去清理,也可用不拆下清理。打开红色框的盖子,到出里面的墨粉,最好用袋子装好清理,防止粉尘到处飞。 拆下来清…

实用指南:Golang学习笔记: 常用标准库

实用指南:Golang学习笔记: 常用标准库pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

AI论文速读 | 当大语言模型遇上时间序列:大语言模型能否执行多步时间序列推理与推断 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

unordered_map性能被吊打!我用基数树让内存池性能暴涨几十倍的秘密

哈喽,大家好,我是小康! 今天要和大家聊一个特别有意思的话题——基数树。 说实话,我第一次听到这个名词的时候,内心是懵逼的。基数?树?这玩意儿到底是啥? 直到有一天,我在研究TCMalloc内存池源码的时候,发现…

网站备案后可以更换域名吗网红营销优势

Title 题目 Automated anomaly-aware 3D segmentation of bones and cartilages in kneeMR images from the Osteoarthritis Initiative 来自骨关节炎计划的膝关节MR图像的自动异常感知3D骨骼和软骨分割 Background 背景 近年来,多个机器学习算法被提出用于图像…