密码加密传输

2023-11-02

1、背景

        我们的系统一般都有用户、密码,用户登录向后端传送密码,明文传输过程中很容易被抓包盗取。我们可以有一下几种解决办法。

1.1 使用https

        https诞生了,它不仅可以将你要传输的密码加密传输,甚至你的所有请求数据在网络传输中都是加密的,别人拿到数据包也没用。

  https真的安全吗?

  https是加密传输, 所以抓到包也没有用, 是密文的。 真是的这样吗? 以百度为例,如下图,可以看到传的用户名,密码(经过了加密)还是可以正常看到明文的。

 

        为什么用https抓包, 还是能看到明文内容呢? 这里我们要理解https的栈流程, 梳理一下就知道, 加密层位于http层和tcp层之间, 所以抓到的http层的数据并没有加密。 同理, 在后台接收端, 经历解密后, 到达http层的数据也是明文。 要注意, https不是对http报文进行加密, 而是对传输数据进行加密, 最终还原http原始报文。 

  这里不得不再次强调,https保证的是传输过程中第三方抓包看到的是密文。客户端和服务端,无论如何都可以拿到明文。其实大多数人认为https加密传输安全是因为没有真正理解https的真实原理。为了更安全就需要自定义加密了。

1.2 自定义加密

        上边说道,https能避免传输的过程中,如果有人截获到数据包只能看到加密后的信息,但是防不了在服务端和客户端截取数据的人。服务器端自不必说,如果黑客都能取到服务器的数据了那你加不加密估计也没什么意义了,但客户端就不一样了,许多密码泄露都是在客户端泄露的。所以客户端密码保护很重要!显然https这点就做不到了。那么,就只有写程序的人自己定义加密方式了。

        还是以百度为例,在登录之前,百度前端获取了一次公钥,用公钥加密后传输加密后的密文密码,后端可以进行解密,这样做到了全流程加密传输。

 

2、后端实现

我们以非对称加密RSA为例。

2.1 引入依赖

引入redis,是因为分布式系统,公钥、私钥需要保存在一个公共缓存中。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>4.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.15</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-ext-jdk15on -->
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-ext-jdk15on</artifactId>
        <version>1.70</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.11</version>
    </dependency>
    <!--redis start-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!--spring2.0集成redis所需common-pool2 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    <!--redis end-->
</dependencies>

2.2 service

package com.ybw.rsa.demo.service;

/**
 * RSA接口
 *
 * @author ybwei
 * @version V1.0
 * @className RsaService
 * @date 2022/8/13
 **/
public interface RsaService {
    /**
     * 私钥解密
     *
     * @param encryptText
     * @methodName: decryptWithPrivate
     * @return: java.lang.String
     * @author: ybwei
     * @date: 2022/8/12
     **/
    String decryptWithPrivate(String encryptText) throws Exception;

    /**
     * 公钥加密-测试
     *
     * @param plaintext 明文内容
     * @methodName: encrypt
     * @return: byte[]
     * @author: ybwei
     * @date: 2022/8/12
     **/
    byte[] encrypt(String plaintext) throws Exception;

    /**
     * 私钥解密-测试
     *
     * @param cipherText 加密后的字节数组
     * @methodName: decrypt
     * @return: java.lang.String
     * @author: ybwei
     * @date: 2022/8/12
     **/
    String decrypt(byte[] cipherText) throws Exception;

    /**
     * 获取公钥
     *
     * @methodName: getPublicKey
     * @return: java.lang.String
     * @author: ybwei
     * @date: 2022/8/12
     **/
    String getPublicKey() throws Exception;
}
package com.ybw.rsa.demo.service.impl;

import com.ybw.rsa.demo.constant.RedisPreConstant;
import com.ybw.rsa.demo.constant.RsaConstant;
import com.ybw.rsa.demo.service.RsaService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.concurrent.TimeUnit;

/**
 * rsa加密
 *
 * @author ybw
 * @version V1.0
 * @className RsaServiceImpl
 * @date 2022/8/12
 **/
@Service
@Slf4j
public class RsaServiceImpl implements RsaService {
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 初始化
     *
     * @methodName: init
     * @return: void
     * @author: ybw
     * @date: 2022/8/12
     **/
    @PostConstruct
    public void init() throws Exception {
        log.info("RsaServiceImpl init start");
        Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
        Security.addProvider(provider);
        SecureRandom random = new SecureRandom();
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", provider);
        generator.initialize(RsaConstant.KEY_SIZE, random);
        KeyPair keyPair = generator.generateKeyPair();
        //将公钥和私钥存放,登录时会不断请求获取公钥,我们可以将其放到缓存中,而不放入数据库了
        //我在想,这个是不是有必要存放到Redis,在分布式场景中?
        //貌似有些必要,万一获取到的pubkey是server1中的,拿着server1的pubkey去server2去解密?
        storeRsa(keyPair);
        log.info("RsaServiceImpl init end");
    }

    /**
     * 将RSA存入缓存
     *
     * @param keyPair
     * @methodName: storeRsa
     * @return: void
     * @author: ybwei
     * @date: 2022/8/13
     **/
    private void storeRsa(KeyPair keyPair) {
        //1、存储公钥key
        String publicRedisKey = getRedisKey(RsaConstant.PUBLIC_KEY);
        PublicKey publicKey = keyPair.getPublic();
        //公钥字符串
        String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded()));
        redisTemplate.opsForValue().set(publicRedisKey, publicKeyStr, 1, TimeUnit.DAYS);

        //2、存储私钥key
        String privateRedisKey = getRedisKey(RsaConstant.PRIVATE_KEY);
        PrivateKey privateKey = keyPair.getPrivate();
        //私钥字符串
        String privateKeyStr = new String(Base64.encodeBase64(privateKey.getEncoded()));
        redisTemplate.opsForValue().set(privateRedisKey, privateKeyStr, 1, TimeUnit.DAYS);
    }

    /**
     * @className RsaServiceImpl
     * @author ybw
     * @date 2022/8/12
     * @version V1.0
     **/
    private String getRedisKey(String publicKey) {
        return new StringBuilder()
                .append(RedisPreConstant.RSA)
                .append(publicKey)
                .toString();
    }

    /**
     * 从字符串中加载公钥
     *
     * @methodName: loadPublicKeyByStr
     * @return: java.security.interfaces.RSAPublicKey
     * @author: ybwei
     * @date: 2022/8/13
     **/
    public RSAPublicKey loadPublicKeyByStr() throws Exception {
        try {
            //公钥数据字符串
            String publicKeyStr = getPublicKey();
            byte[] buffer = Base64.decodeBase64(publicKeyStr);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
            return (RSAPublicKey) keyFactory.generatePublic(keySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法");
        } catch (InvalidKeySpecException e) {
            throw new Exception("公钥非法");
        } catch (NullPointerException e) {
            throw new Exception("公钥数据为空");
        }
    }

    /**
     * 从字符串中加载私钥
     *
     * @methodName: loadPrivateKeyByStr
     * @return: java.security.interfaces.RSAPrivateKey
     * @author: ybwei
     * @date: 2022/8/13
     **/
    public RSAPrivateKey loadPrivateKeyByStr() throws Exception {
        try {
            //私钥数据字符串
            String privateKeyStr = getPrivateKey();
            byte[] buffer = Base64.decodeBase64(privateKeyStr);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法");
        } catch (InvalidKeySpecException e) {
            throw new Exception("私钥非法");
        } catch (NullPointerException e) {
            throw new Exception("私钥数据为空");
        }
    }


    /**
     * 私钥解密(解密前台公钥加密的密文)
     *
     * @param encryptText 公钥加密的数据
     * @return 私钥解密出来的数据
     * @throws Exception e
     */
    @Override
    public String decryptWithPrivate(String encryptText) throws Exception {
        if (StringUtils.isBlank(encryptText)) {
            return null;
        }
        byte[] en_byte = Base64.decodeBase64(encryptText.getBytes());
        Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
        Security.addProvider(provider);
        Cipher ci = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);
        PrivateKey privateKey = loadPrivateKeyByStr();
        ci.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] res = ci.doFinal(en_byte);
        return new String(res);
    }

    /**
     * 公钥加密
     *
     * @param plaintext 明文内容
     * @return byte[]
     * @throws UnsupportedEncodingException e
     */
    @Override
    public byte[] encrypt(String plaintext) throws Exception {
        String encode = URLEncoder.encode(plaintext, "utf-8");
        RSAPublicKey rsaPublicKey = loadPublicKeyByStr();
        //获取公钥指数
        BigInteger e = rsaPublicKey.getPublicExponent();
        //获取公钥系数
        BigInteger n = rsaPublicKey.getModulus();
        //获取明文字节数组
        BigInteger m = new BigInteger(encode.getBytes());
        //进行明文加密
        BigInteger res = m.modPow(e, n);
        return res.toByteArray();

    }

    /**
     * 私钥解密
     *
     * @param cipherText 加密后的字节数组
     * @return 解密后的数据
     * @throws UnsupportedEncodingException e
     */
    @Override
    public String decrypt(byte[] cipherText) throws Exception {
        RSAPrivateKey prk = loadPrivateKeyByStr();
        // 获取私钥参数-指数/系数
        BigInteger d = prk.getPrivateExponent();
        BigInteger n = prk.getModulus();
        // 读取密文
        BigInteger c = new BigInteger(cipherText);
        // 进行解密
        BigInteger m = c.modPow(d, n);
        // 解密结果-字节数组
        byte[] mt = m.toByteArray();
        //转成String,此时是乱码
        String en = new String(mt);
        //再进行编码,最后返回解密后得到的明文
        return URLDecoder.decode(en, "UTF-8");
    }

    /**
     * 获取公钥
     *
     * @methodName: getPublicKey
     * @return: java.lang.String
     * @author: ybw
     * @date: 2022/8/12
     **/
    @Override
    public String getPublicKey() throws Exception {
        //1、获取redis key
        String publicRedisKey = getRedisKey(RsaConstant.PUBLIC_KEY);
        //2、获取公钥字符串
        String publicKeyStr = (String) redisTemplate.opsForValue().get(publicRedisKey);
        if (StringUtils.isNotBlank(publicKeyStr)) {
            log.info("RsaServiceImpl getPublicKey publicKeyStr:{}", publicKeyStr);
            return publicKeyStr;
        }
        //3、初始化
        init();
        //4、重新获取公钥字符串
        return getPublicKey();
    }

    /**
     * 获取私钥
     *
     * @methodName: getPrivateKey
     * @return: java.lang.String
     * @author: ybw
     * @date: 2022/8/12
     **/
    public String getPrivateKey() throws Exception {
        //1、获取redis key
        String privateRedisKey = getRedisKey(RsaConstant.PRIVATE_KEY);
        //2、获取私钥数据字符串
        String privateKeyStr = (String) redisTemplate.opsForValue().get(privateRedisKey);
        if (StringUtils.isNotBlank(privateKeyStr)) {
            log.info("RsaServiceImpl getPrivateKey privateKeyStr:{}", privateKeyStr);
            return privateKeyStr;
        }
        //3、初始化
        init();
        //4、重新获取公钥字符串
        return getPrivateKey();
    }
}
  • 项目启动,初始化公钥、私钥。
  • 公钥、私钥有效期1天。
  • 当公钥、私钥失效后,会重新初始化公钥、私钥。
  • 公钥、私钥存入Redis缓存后,可以支持多节点部署。

2.3 接口

获取公钥

package com.ybw.rsa.demo.controller;

import com.ybw.rsa.demo.service.RsaService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author ybwei
 * @version V1.0
 * @className RSAController
 * @date 2022/8/12
 **/
@RestController
public class RSAController {
    @Resource
    private RsaService rsaService;

    /**
     * 获取公钥
     *
     * @methodName: getPublicKey
     * @return: java.lang.String
     * @author: ybw
     * @date: 2022/8/12
     **/
    @GetMapping("/getPublicKey")
    public String getPublicKey() throws Exception {
        return rsaService.getPublicKey();
    }
}

登录接口(解密逻辑)

package com.ybw.rsa.demo.controller;

import com.alibaba.fastjson2.JSON;
import com.ybw.rsa.demo.service.RsaService;
import com.ybw.rsa.demo.vo.req.LoginReqVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@Controller
@Slf4j
public class LoginController {

    @Resource
    private RsaService rsaService;

    /**
     * @param loginReqVO
     * @methodName: login
     * @return: java.lang.String
     * @author: ybw
     * @date: 2022/8/12
     **/
    @PostMapping(value = "/login")
    @ResponseBody
    public String login(@RequestBody LoginReqVO loginReqVO) throws Exception {
        log.info("loginReqVO:{}", JSON.toJSONString(loginReqVO));
        //解密后的密码
        String password = rsaService.decryptWithPrivate(loginReqVO.getPassword());
        log.info("解密后密码,password:{}", password);
        return "OK";
    }
}

3、测试验证

密码解密成功

[INFO ] 2022-08-13 23:46:02.239 [http-nio-8081-exec-8] c.y.r.d.service.impl.RsaServiceImpl - RsaServiceImpl getPublicKey publicKeyStr:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJuAH3mGIYUm2CRWifRbRWFef9dKaK3M9WtI0o7ikjQI5NQocEimaqHhoIxYOjb3Z5XIT1ZkI0Roa7L+J8psfVcXeKr3UxT3OnQCdJphC8bRfv9Hzu0sayqtLj7T9t7nptyAfDcME7cRaGiNJoXrMYl8hkFXzDDRbO2tFwymwGkwIDAQAB
[INFO ] 2022-08-13 23:46:02.254 [http-nio-8081-exec-9] c.y.r.d.controller.LoginController - loginReqVO:{"password":"JYZckB2tGtpuJQfqYRLYVGd/jHHPtPtWmEOf+BAtLTydyhvoQoNbejVE5ufoeV1FrQzOgTfx0aUCH3sBrm/xcKP2QWHxzp68tqD9n4ZpWkSP+D8tJmTQgIPHkCOtYekpqVa3/QKKI0c8fU7ADu4FrMRbQLadmIYdi1wsrfIqvK8=","username":"admin"}
[INFO ] 2022-08-13 23:46:02.726 [http-nio-8081-exec-9] c.y.r.d.service.impl.RsaServiceImpl - RsaServiceImpl getPrivateKey privateKeyStr:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMm4AfeYYhhSbYJFaJ9FtFYV5/10porcz1a0jSjuKSNAjk1ChwSKZqoeGgjFg6NvdnlchPVmQjRGhrsv4nymx9Vxd4qvdTFPc6dAJ0mmELxtF+/0fO7SxrKq0uPtP23uem3IB8NwwTtxFoaI0mhesxiXyGQVfMMNFs7a0XDKbAaTAgMBAAECgYATN3Jd3Kh2Wgk7VdK9CZjqcop353r405xKTZz8/ziatnWtVTR48ZkM2nKZz1HWagdGpye2G8McKR6AtUka8uXVJj+8z3eeGaS+TMlzPbdOK+COp9OZex5HZHTsBqsCGUZ+BJjWMgc8+2Y60e8F53jaCAyVvd8TGNZmjBO7wKccQQJBAPFodMkO7wlDeJJdQvSqXsBvs0TQn2AdTzqj5VUNTy1LVf7b+YOR2aSYjonp1RGi4P2LDONL1gJWoWXmHK0YrnECQQDV6WaSwvjvY8Rxmx3hbxA1/WTFqv/RCOf8n0UxQuZ1YoNjv1enlX6cqMuDfmHiiC/pWf9D7Qnph+sX1Eqc+c9DAkEApSL+WJc1nxGfhgf0CGgO/vaqHBXWICqMiyGYfFDpa6OQRRH3IjCAQF73ipIBZdoUrHwVKdszn0/hglIiJaqvkQJAVfJ9gCJOmwDfATZt/xH81XSGdNWMC5UkgOANkQlsR2XZnM5YjcEHKjK38pFpCvflKEE8yzIGdYpi7yQhBolouQJBAIQaLXw68AYtohzJvxFtjyer+sgzN2JYYHKaGQtT0WGxTnuMrJuQteFxlFGvLOJl+EcfPetdzu5uF7MnZfz+MhU=
[INFO ] 2022-08-13 23:46:02.730 [http-nio-8081-exec-9] c.y.r.d.controller.LoginController - 解密后密码,password:123456

4、代码demo

share: 分享仓库 - Gitee.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

密码加密传输 的相关文章

  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe

随机推荐

  • Java生成二维码并解决中文乱码问题

    Java生成二维码并解决中文乱码问题 引入依赖 JAVA代码 引入依赖 maven工程
  • ESP32+st7789/ili9341运行LVGL例程,依赖ESP-IDF编译lv_port_esp32官方Demo(1)

    LVGL是一个C语言编写的免费的开源图形库 其提供了用于嵌入式GUI的各种元素 用户可以利用丰富的图形库资源 在消耗极低内存的情况下构建视觉效果丰富多彩的GUI 只需 64kB 闪存和 8kB RAM 就足以满足简单的用户界面 LVGL 可
  • 【ObjectARX】--创建和访问图形数据库(DwgDatabase)

    1 使用ObjectARX创建新工程DwgDatabase 选择MFC支持 2 注册一个命令CreateDwg创建一个新的图形文件 并保存在AutoCAD的安装路径中 实现函数为 static void AAAMyGroupCreateDw
  • Java链式编程与Builder(建造者)设计模式

    一 链式编程 1 1 释义 链式编程 也叫级联式编程 调用对象的函数时返回一个this对象指向对象本身 达到链式效果 可以级联调用 1 2 特点 可以通过一个方法调用多个方法 将多个方法调用链接起来 形成一条 链式 从而提高代码的可读性 1
  • ASP.NET Web Pages基础知识---Razor 实例:显示图片

    假设在您的图像文件夹中有 3 张图像 您想根据用户的选择动态地显示图像 这可以通过一段简单的 Razor 代码来实现 如果在您的网站的图像文件夹中有一个名为 Photo1 jpg 的图像 您可以使用 HTML 的 img 元素来显示图像 如
  • 用于机器学习的 NumPy(ML)

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 031.PyQt5_QCommandLinkButton_命令链接按钮

    QCommandLinkButton命令链接按钮 描述 命令链接是Windows Vista引入的新控件 它的用途类似于单选按钮的用途 因为它用于在一组互斥选项之间进行选择 命令链接按钮不应单独使用 而应作为向导和对话框中单选按钮的替代选项
  • 【pytorch】微调技术

    前言 训练神经网络是一件非常耗费时间的事情 其需要大量的算力以及大量的数据 显然从头开始训练并不是明智之选 利用好已有的资源才是明智之选 微调技术 图像识别笼统地可以分为两步 提取图片的特征 此部分往往通过CNN卷积神经网络实现 根据提取的
  • Qt5学习笔记3:Qt的ui界面文件与程序源代码的生成关系及访问

    首先 按照前面章节的方法 创建一个工程demo 位于目录demo 下 然后直接编译运行 弹出一个空窗口 如下 工程项目在Qt creator的管理界面显示如下 在工程目录demo 下 生成了两个文件夹 build xxx Debug和dem
  • 5.网络爬虫——Xpath解析

    网络爬虫 Xpath解析 Xpath简介 Xpath解析 节点选择 路径表达式 谓语 未知节点 Xpath实战演示 豆果美食实战 获取数据 源代码 前言 此专栏文章是专门针对Python零基础爬虫 欢迎免费订阅 第一篇文章获得全站热搜第一
  • TensorFlow学习笔记(二)Tensorflow+VScode和Jupyter NoteBook新姿势

    TensorFlow学习笔记 二 Tensorflow VScode和Jupyter NoteBook新姿势 过了一个星期了 自己弄环境弄了两天之后 装好环境整个人就开始懒散 不想写东西 但想到既然开始了 那就坚持写下去吧 上次用Anaco
  • chatgpt赋能python:Python主成分分析(PCA)结果解读

    Python主成分分析 PCA 结果解读 主成分分析 PCA 作为一种重要的多元统计方法 可以对多个变量进行降维处理 从而提取出相关性最高的主成分作为新的维度来进行数据分析和可视化 Python是一种流行的编程语言 它提供了许多快速和灵活的
  • mysql oracle 查看数据库中有哪些数据表, 数据表中有哪些字段

    文章目录 1 查看mysql中有都有哪些数据库 2 查看数据库中都有哪些数据表 2 1 for mysql 2 2 for oracle 3 查看数据表中都有哪些字段 3 1 mysql方法1 3 2mysql方法2 推荐 3 3 for
  • java如何定义一个变长数组_如何自定义一个长度可变数组

    摘要 本文主要写了如何自定义一个长度可变数组 数组是在程序设计中 为了处理方便 把具有相同类型的若干元素按无序的形式组织起来的一种形式 在定义之初 数组的长度就被定义 新建数组有很多方式 下面两个都可以 但一般书写习惯会选择第一种 1 St
  • window VNC连接linux Unable to connect to VNC Server

    gsettings set org gnome Vino require encryption false 若不生效 可以尝试重启服务器 本人重启后生效
  • python中if的基本用法(if,else,elif,and,or,if嵌套,跟电脑猜拳)

    用实例来演示 if 要判断的条件 条件成立的时候 要做的事 1 定义一个整数变量 age 12 2 判断是否满18岁 if age gt 18 print 欢迎来酒吧 print 成年后再来哦 但是当age 18时候 就会出现问题 所以我们
  • SpringMVC进阶:常用注解、参数传递和请求响应以及页面跳转

    目录 一 常用注解 1 1 RequestMapping 1 2 RequestParam 1 3 ModelAttribute 1 4 SessionAttributes 1 5 RequestBody 1 6 RequestHeader
  • 一文介绍机器学习中的三种特征选择方法

    作者 luanhz 来源 小数志 导读 机器学习中的一个经典理论是 数据和特征决定了机器学习的上限 而模型和算法只是逼近这个上限 也正因如此 特征工程在机器学习流程中占有着重要地位 广义的特征工程一般可分为三个环节 特征提取 特征选择 特征
  • 一次脏牛(Dirty Cow)漏洞提权实验

    脏牛 Dirty Cow 是Linux内核的一个提权漏洞 之所以叫Dirty Cow Linux内核的内存子系统在处理写时拷贝 Copy on Write 时存在条件竞争漏洞 导致可以破坏私有只读内存映射 一个低权限的本地用户能够利用此漏洞
  • 密码加密传输

    1 背景 我们的系统一般都有用户 密码 用户登录向后端传送密码 明文传输过程中很容易被抓包盗取 我们可以有一下几种解决办法 1 1 使用https https诞生了 它不仅可以将你要传输的密码加密传输 甚至你的所有请求数据在网络传输中都是加