关于RSA公私钥加密报错Data must not be longer than 117 bytes问题解决办法
一、问题描述
1.背景
大家都知道,在日常项目开发过程中,数据的传输安全一直都是值得重视的问题,当然了市面上解决此类办法的技术也有很多,本项目在提供给第三方使用是数据以及校验第三方传递的参数,采用常用的RSA公私钥加解密的方式进行数据安全传输。
1.2RSA工具类
普通版
此工具类包含公私钥生成,及加解密方法
package com.juhe.gjj.util;import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import org.apache.tomcat.util.codec.binary.Base64;import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;import static cn.hutool.crypto.SmUtil.sm3;/*** @author kiki* @date 2024/2/26* @description*/
public class RsaUtil {//用于封装随机产生的公钥与私钥private static Map<Integer, String> keyMap = new HashMap<Integer, String>();/*** 随机生成密钥对* @throws NoSuchAlgorithmException*/public static void genKeyPair() throws NoSuchAlgorithmException {// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");// 初始化密钥对生成器,密钥大小为96-1024位keyPairGen.initialize(1024,new SecureRandom());// 生成一个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));// 得到私钥字符串String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));// 将公钥和私钥保存到Map(0表示公钥,1表示私钥)keyMap.put(0,publicKeyString);keyMap.put(1,privateKeyString);}/*** RSA公钥加密** @param str* 加密字符串* @param publicKey* 公钥* @return 密文* @throws Exception* 加密过程中的异常信息*/public static String encrypt(String str, String publicKey) throws Exception{//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));return outStr;}/*** RSA私钥解密** @param str* 加密字符串* @param privateKey* 私钥* @return 铭文* @throws Exception* 解密过程中的异常信息*/public static String decrypt(String str, String privateKey) throws Exception{//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;}public static String getEncryptedStr(Long timestamp, String systemCode, String secretKey){String syncSign = "";syncSign = sm3(systemCode + timestamp + secretKey);Map map = new HashMap();map.put("timestamp", timestamp);map.put("syncSign", syncSign);String content = JSONUtil.toJsonStr(map);return BizSmUtil.sm4DoEncrypt(secretKey, content);}public static void main(String[] args) throws Exception{//生成公钥和私钥genKeyPair();//加密字符串//String message = "df723820";String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCT/NMk9W1pi5O6vHWbZ1nH8idxynONUEpUYf8N0rJ3MP5I7mAHN6LM+cCd/z3JR2ofE0naq3pv5hfJnYHmK/ujhflmRPwDY4thNOKE8IHVJazAunW9HXczA5abK8RSGcGvKCl7C35zFOfBod1ksYFLIzKBEXBhtkiH/qGnEaYnhwIDAQAB";String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJP80yT1bWmLk7q8dZtnWcfyJ3HKc41QSlRh/w3Ssncw/kjuYAc3osz5wJ3/PclHah8TSdqrem/mF8mdgeYr+6OF+WZE/ANji2E04oTwgdUlrMC6db0ddzMDlpsrxFIZwa8oKXsLfnMU58Gh3WSxgUsjMoERcGG2SIf+oacRpieHAgMBAAECgYA4lvSS7HsTYjlyrgB3FbViXToyLE21mx9hVzv2KDzwkT6b2vPDrsXFhjfe8yzIXFO7YF/ci7g9NAqioWV8BBOsZNA8FelZkdOcNkLzS0jXlWvh74U0/bkrg+3TR+lvYbqw4eC7pBzn+mXJeN5RUbtDIvTq8BnceUNxgr3t6C4mCQJBAOJJn406uFfjc4M3pRf0hIw2+cAxI+GzkxZxEVk/fuIIz/4fPkWdqlqwbLbd5BkmlJKPI3WB0/wa2FlcJOQAh4UCQQCnaz6Mof0+5zXioG3NaotISUwTb7tKjc8riW3wGCoQhrMCRDPgkIC9GWSFGDiMNoCGZu8xtRPmp971vctrVdKbAkEA4FqgbzTl6nWfZFy6Obr748zp5+yQp8kULy7hRXxXv6F/HnQ5mGoOqaW7077B1VHUAk8al/mlhJHVKRvbk5cWxQJAIBpxgRgi7qf5bj6jL4upr6/WdbesK2yr+EY/HZYUotyhgOLBK+OpvBkdbGQrm79rv9oHLfnyGf3AxFCjrC5l1wJAUhqQnmKyIo2tTONEtRW2nFd7nHCZ3nm4G8Mh+dP0m14m5By9coWKU9uFhLuq+L+VpEFLjIx1Dg8qiYRLdQQH+Q==";HashMap<String, Object> mp = new HashMap<>();mp.put("createtime1","12344444445");mp.put("createtime2","12344444445");mp.put("createtime3","12344444445");mp.put("createtime4","12344444445");mp.put("createtime5","12344444445");mp.put("createtime6","12344444445");mp.put("createtime7","12344444445");mp.put("createtime8","12344444445");mp.put("createtime9","12344444445");mp.put("createtime19","12344444445");mp.put("createtime12","12344444445");mp.put("createtime23","12344444445");mp.put("createtime81","12344444445");mp.put("createtime91","12344444445");String message = JSON.toJSONString(mp);System.out.println("随机生成的公钥为:" + publicKey);System.out.println("随机生成的私钥为:" + privateKey);String messageEn = encrypt(message,publicKey);System.out.println(message + "\t加密后的字符串为:" + messageEn);String messageDe = decrypt(messageEn,privateKey);System.out.println("还原后的字符串为:" + messageDe);
// TokenVO tokenVO = JSON.parseObject(messageDe, TokenVO.class);
// System.out.println(tokenVO);}
}
但是上述处理公私钥的方式,如果加密字符串data过长,则会导致Data must not be longer than 117 bytes的异常
1.3RSAUtil升级
原理是采用分段加解密,如此解决,当然了如果要加密的原始数据过长,这样的效率也是很低的
package com.juhe.gjj.util;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.codec.binary.Base64;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import java.io.UnsupportedEncodingException;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;/*** @author kiki* @date 2024/2/29* @description*/
@Slf4j
public class RsaExpandUtil {public static final String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCT/NMk9W1pi5O6vHWbZ1nH8idxynONUEpUYf8N0rJ3MP5I7mAHN6LM+cCd/z3JR2ofE0naq3pv5hfJnYHmK/ujhflmRPwDY4thNOKE8IHVJazAunW9HXczA5abK8RSGcGvKCl7C35zFOfBod1ksYFLIzKBEXBhtkiH/qGnEaYnhwIDAQAB";public static final String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJP80yT1bWmLk7q8dZtnWcfyJ3HKc41QSlRh/w3Ssncw/kjuYAc3osz5wJ3/PclHah8TSdqrem/mF8mdgeYr+6OF+WZE/ANji2E04oTwgdUlrMC6db0ddzMDlpsrxFIZwa8oKXsLfnMU58Gh3WSxgUsjMoERcGG2SIf+oacRpieHAgMBAAECgYA4lvSS7HsTYjlyrgB3FbViXToyLE21mx9hVzv2KDzwkT6b2vPDrsXFhjfe8yzIXFO7YF/ci7g9NAqioWV8BBOsZNA8FelZkdOcNkLzS0jXlWvh74U0/bkrg+3TR+lvYbqw4eC7pBzn+mXJeN5RUbtDIvTq8BnceUNxgr3t6C4mCQJBAOJJn406uFfjc4M3pRf0hIw2+cAxI+GzkxZxEVk/fuIIz/4fPkWdqlqwbLbd5BkmlJKPI3WB0/wa2FlcJOQAh4UCQQCnaz6Mof0+5zXioG3NaotISUwTb7tKjc8riW3wGCoQhrMCRDPgkIC9GWSFGDiMNoCGZu8xtRPmp971vctrVdKbAkEA4FqgbzTl6nWfZFy6Obr748zp5+yQp8kULy7hRXxXv6F/HnQ5mGoOqaW7077B1VHUAk8al/mlhJHVKRvbk5cWxQJAIBpxgRgi7qf5bj6jL4upr6/WdbesK2yr+EY/HZYUotyhgOLBK+OpvBkdbGQrm79rv9oHLfnyGf3AxFCjrC5l1wJAUhqQnmKyIo2tTONEtRW2nFd7nHCZ3nm4G8Mh+dP0m14m5By9coWKU9uFhLuq+L+VpEFLjIx1Dg8qiYRLdQQH+Q==";/*** RSA公钥加密** @param str 加密字符串* @param publicKey 公钥* @return 密文* @throws Exception 加密过程中的异常信息*/public static String encrypt(String str, String publicKey) throws Exception {log.info("|RSA公钥加密前的数据|str:{}|publicKey:{}", str, publicKey);//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);//当长度过长的时候,需要分割后加密 117个字节byte[] resultBytes = getMaxResultEncrypt(str, cipher);String outStr = Base64.encodeBase64String(resultBytes);log.info("|公钥加密后的数据|outStr:{}", outStr);return outStr;}private static byte[] getMaxResultEncrypt(String str, Cipher cipher) throws IllegalBlockSizeException, BadPaddingException {byte[] inputArray = str.getBytes();int inputLength = inputArray.length;log.info("|加密字节数|inputLength:{}", inputLength);// 最大加密字节数,超出最大字节数需要分组加密int MAX_ENCRYPT_BLOCK = 117;// 标识int offSet = 0;byte[] resultBytes = {};byte[] cache = {};while (inputLength - offSet > 0) {if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);offSet += MAX_ENCRYPT_BLOCK;} else {cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);offSet = inputLength;}resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);}return resultBytes;}/*** RSA私钥解密** @param str 加密字符串* @param privateKey 私钥* @return 铭文* @throws Exception 解密过程中的异常信息*/public static String decrypt(String str, String privateKey) throws Exception {log.info("|RSA私钥解密前的数据|str:{}|privateKey:{}", str, privateKey);//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);
// String outStr = new String(cipher.doFinal(inputByte));//当长度过长的时候,需要分割后解密 128个字节String outStr = new String(getMaxResultDecrypt(str, cipher));log.info("|RSA私钥解密后的数据|outStr:{}", outStr);return outStr;}private static byte[] getMaxResultDecrypt(String str, Cipher cipher) throws IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {byte[] inputArray = Base64.decodeBase64(str.getBytes("UTF-8"));int inputLength = inputArray.length;log.info("|解密字节数|inputLength:{}", inputLength);// 最大解密字节数,超出最大字节数需要分组加密int MAX_ENCRYPT_BLOCK = 128;// 标识int offSet = 0;byte[] resultBytes = {};byte[] cache = {};while (inputLength - offSet > 0) {if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);offSet += MAX_ENCRYPT_BLOCK;} else {cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);offSet = inputLength;}resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);}return resultBytes;}public static void main(String[] args) throws Exception{//加密字符串//String message = "df723820";String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCT/NMk9W1pi5O6vHWbZ1nH8idxynONUEpUYf8N0rJ3MP5I7mAHN6LM+cCd/z3JR2ofE0naq3pv5hfJnYHmK/ujhflmRPwDY4thNOKE8IHVJazAunW9HXczA5abK8RSGcGvKCl7C35zFOfBod1ksYFLIzKBEXBhtkiH/qGnEaYnhwIDAQAB";String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJP80yT1bWmLk7q8dZtnWcfyJ3HKc41QSlRh/w3Ssncw/kjuYAc3osz5wJ3/PclHah8TSdqrem/mF8mdgeYr+6OF+WZE/ANji2E04oTwgdUlrMC6db0ddzMDlpsrxFIZwa8oKXsLfnMU58Gh3WSxgUsjMoERcGG2SIf+oacRpieHAgMBAAECgYA4lvSS7HsTYjlyrgB3FbViXToyLE21mx9hVzv2KDzwkT6b2vPDrsXFhjfe8yzIXFO7YF/ci7g9NAqioWV8BBOsZNA8FelZkdOcNkLzS0jXlWvh74U0/bkrg+3TR+lvYbqw4eC7pBzn+mXJeN5RUbtDIvTq8BnceUNxgr3t6C4mCQJBAOJJn406uFfjc4M3pRf0hIw2+cAxI+GzkxZxEVk/fuIIz/4fPkWdqlqwbLbd5BkmlJKPI3WB0/wa2FlcJOQAh4UCQQCnaz6Mof0+5zXioG3NaotISUwTb7tKjc8riW3wGCoQhrMCRDPgkIC9GWSFGDiMNoCGZu8xtRPmp971vctrVdKbAkEA4FqgbzTl6nWfZFy6Obr748zp5+yQp8kULy7hRXxXv6F/HnQ5mGoOqaW7077B1VHUAk8al/mlhJHVKRvbk5cWxQJAIBpxgRgi7qf5bj6jL4upr6/WdbesK2yr+EY/HZYUotyhgOLBK+OpvBkdbGQrm79rv9oHLfnyGf3AxFCjrC5l1wJAUhqQnmKyIo2tTONEtRW2nFd7nHCZ3nm4G8Mh+dP0m14m5By9coWKU9uFhLuq+L+VpEFLjIx1Dg8qiYRLdQQH+Q==";HashMap<String, Object> mp = new HashMap<>();mp.put("createtime1","12344444445");mp.put("createtime2","12344444445");mp.put("createtime3","12344444445");mp.put("createtime4","12344444445");mp.put("createtime5","12344444445");mp.put("createtime6","12344444445");mp.put("createtime7","12344444445");mp.put("createtime8","12344444445");mp.put("createtime9","12344444445");mp.put("createtime19","12344444445");mp.put("createtime12","12344444445");mp.put("createtime23","12344444445");mp.put("createtime81","12344444445");mp.put("createtime91","12344444445");String message = JSON.toJSONString(mp);String messageEn = encrypt(message,publicKey);System.out.println(message + "\n加密后的字符串为:" + messageEn);String messageDe = decrypt(messageEn ,privateKey);System.out.println("还原后的字符串为:" + messageDe);}
}
相关文章:
关于RSA公私钥加密报错Data must not be longer than 117 bytes问题解决办法
一、问题描述 1.背景 大家都知道,在日常项目开发过程中,数据的传输安全一直都是值得重视的问题,当然了市面上解决此类办法的技术也有很多,本项目在提供给第三方使用是数据以及校验第三方传递的参数,采用常用的RSA公私…...

【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0
目录 一、 Kubernetes 的概述 二、服务器配置 2.1 服务器部署规划 2.2服务器初始化配置 三、安装Docker/kubeadm/kubelet【所有节点】 3.1 安装Docker 3.2 添加阿里云YUM软件源 3.3 安装kubeadm,kubelet和kubectl 四、部署Kubernetes Master 五、部署Kube…...

Android 开发环境搭建的步骤
本文将为您详细讲解 Android 开发环境搭建的步骤。搭建 Android 开发环境需要准备一些软件和工具,以下是一些基础步骤: 1. 安装 Java Development Kit (JDK) 首先,您需要安装 Java Development Kit (JDK)。JDK 是 Android 开发的基础…...

六、继承(一)
1 继承的引入 以往我们想分别实现描述学生、老师的类,可能会这样子做: class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…...

数字化转型导师鹏:政府数字化转型政务服务类案例研究
政府数字化转型政务服务类案例研究 课程背景: 很多地方政府存在以下问题: 不清楚标杆省政府数字化转型的政务服务类成功案例 不清楚地级市政府数字化转型的政务服务类成功案例 不清楚县区级政府数字化转型的政务服务类成功案例 课程特色&#x…...

解决ODOO12 恢复数据库提示内存不够报错
1. 现象 点击 ‘restore database’ 控制台报错: 2. 解决措施 a. 进入启动脚本的文件夹 cd odoo/odoo-12.0/输入命令 ./odoo-bin --addons-pathaddons --databaseodoo --db_userodoo --db_passwordodoo --db_hostlocalhost --db_port5432 -i INITb. 刷新页面…...

关于数据提交上传服务端的数据类型以及项目打包上线的流程
1 请求头的类型: content-type; 01: application/json 数据以json格式请求:{"key":"value"} 02: application/x-www.form-urlencoded from表单的数据格式 name"zs"&age12 03 mutipart/form-data…...
儿童悬吊训练系统:改善脑性麻痹儿童平衡感与运动能力的有效途径
脑性麻痹(CP)是一种运动障碍,常常由于早期的运动皮层损伤而引起。这种损伤可能导致姿势、操纵技能和行走能力的差异。平衡控制不良是 CP 患儿面临的一项主要挑战,它可能导致动作控制异常以及步态问题,从而影响日常活动…...

ElasticSearch之文档的存储
写在前面 本文看下文档的存储相关内容。 1:如何确定文档存储在哪个分片? 我们需要确保文档均匀分布在所有的分片中,避免某些部分机器空闲,部分机器繁忙的情况出现,想要实现均匀分布我们可以考虑如下的几种分片路由算…...
在Redhat 7 Linux上安装llama.cpp [ 错误stdatomic.h: No such file or directory]
前期准备 在github上下载llama.cpp或克隆。 GitHub - ggerganov/llama.cpp: LLM inference in C/C git clone https://github.com/ggerganov/llama.cpp.gitcd llama.cpp 执行make命令编译llama.cpp make 在huggingface里下载量化了的 gguf格式的llama2模型。 https:/…...

linux 常用 命令行HTTP客户端
在Linux环境中,命令行HTTP客户端是一种用于发送HTTP请求的工具,它们通常用于测试网站、服务器或API的响应。这些客户端支持各种HTTP方法,如GET、POST、PUT、DELETE等,并允许用户设置请求头、发送数据等。以下是一些常用的命令行HT…...
深入理解@Param注解:用于参数映射的利器
摘要:Param注解在Java开发中被广泛应用,它可以优雅地解决方法参数与SQL语句中占位符的映射问题,提高代码的可读性和可维护性。本文将深入探讨Param注解的背景、使用方法、解决的问题、映射原理,并对使用与不使用Param注解的情况进…...
OCP Secure boot必要特性
三点必需要求: The platform components must: 1. Provide a mechanism for securely anchoring a root of trust public key. // 提供一种用于安全地锚定信任根公钥的机制。 2. Verify the device firmware digital signature using the anchored public key /…...

全新攻击面管理平台
首页大屏 内测阶段,免费试用一个月 有兴趣体验的师傅,来长亭云图极速版群里找我 py...

在VMware中安装CentOS 7并配置Docker
VMware安装CentOS 7 一、介绍 该文章介绍如何使用启动U盘在虚拟机里面安装系统,虚拟机版本为VMware Workstation 16 pro,Linux版本为CentOS Linux release 7.9.2009 (Core)。 二、安装 1、创建虚拟机 点击创建新的虚拟机 选择典型就可以了…...

Leetcoder Day37| 动态规划part04 背包问题
01背包理论基础 面试掌握01背包,完全背包和重背包就够用了。 背包问题的理论基础重中之重是01背包,一定要理解透! 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品…...
突破编程_C++_面试(STL 编程 vector )
面试题 1 :std::vector 的底层存储机制是什么? std::vector 的底层存储机制是一个动态数组,它内部通过一片连续的内存空间来存储元素。当这个连续的内存空间不足以容纳新元素时,std::vector 会自动申请一块更大的内存空间&#x…...

【报名指南】2024年第九届数维杯数学建模挑战赛报名全流程图解
1.官方报名链接: 2024年第九届数维杯大学生数学建模挑战赛http://www.nmmcm.org.cn/match_detail/32 2.报名流程(电脑与手机报名操作流程一致) 参赛对象为在校专科生、本科生、研究生,每组参赛人数为1-3人(指导老师不…...

C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码
David A. Huffman 1 哈夫曼编码简史(Huffman code) 1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是…...

JS 对象数组排序方法测试
输出 一.Array.prototype.sort() 1.默认排序 sort() sort() 方法就地对数组的元素进行排序,并返回对相同数组的引用。默认排序是将元素转换为字符串,然后按照它们的 UTF-16 码元值升序排序。 由于它取决于具体实现,因此无法保证排序的时…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...