Java安全——基于密码的加密

news2024/9/22 1:27:41

Java安全

基于密码的加密

基于密码加密和SSL加密的区别

  • 密码加密可以数据和密码分离传输
  • SSL只限于在套接字空间传输的数据进行加密

SSL和密码加密

密码加密是指通过算法将原始信息转换成密文,只有知道相应密钥的人才能解密。Java中常用的密码加密算法包括MD5、SHA、AES、DES等,可以用于实现用户密码的加密存储、数据安全传输等场景。

SSL加密(Secure Sockets Layer)是一种基于公钥加密技术的安全协议,主要用于保证数据在传输过程中的安全性和完整性。SSL通过使用数字证书来确保客户端与服务端之间的通信安全,可以防止网络中间人攻击、数据篡改、信息泄露等问题。在Java中,使用SSLSocket、SSLServerSocket等类可以实现SSL加密传输。

密码引擎

在Java Cryptography Extension (JCE) 中,有多种加密引擎可供使用。以下是每个引擎的简要说明和使用示例:

  1. Cipher:用于对称加密和解密算法。可以使用getInstance方法获取Cipher对象,并指定加密算法和工作模式/填充模式。然后使用init方法初始化Cipher对象,传递加密操作模式(加密、解密、包括需要的密钥和其他参数)以及密钥。最后,使用doFinal方法进行实际的加密和解密操作。
    示例:
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
    byte[] encryptedData = cipher.doFinal(data);
    
  2. KeyGenerator:用于生成对称密钥。可使用getInstance方法获取KeyGenerator对象,并指定密钥算法。然后使用init方法初始化密钥生成器,设置密钥的长度、安全随机数源等。最后,使用generateKey方法生成对称密钥。
    示例:
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(256);
    SecretKey secretKey = keyGenerator.generateKey();
    
  3. SecureRandom:生成安全随机数。可使用getInstance方法获取SecureRandom对象,并选择合适的算法。然后,直接调用nextBytes方法生成指定长度的随机字节。
    示例:
    SecureRandom secureRandom = SecureRandom.getInstanceStrong();
    byte[] randomBytes = new byte[16];
    secureRandom.nextBytes(randomBytes);
    
  4. Signature:用于数字签名和验证。可以使用getInstance方法获取Signature对象,并选择签名算法。然后,通过initSign方法初始化签名对象并传递私钥,或通过initVerify方法初始化验证对象并传递公钥。最后,使用update方法传入要签名的数据,调用sign方法进行签名,或调用verify方法进行验证。
    示例:
    Signature signature = Signature.getInstance("SHA256withRSA");
    signature.initSign(privateKey);
    signature.update(data);
    byte[] signatureBytes = signature.sign();
    
  5. Mac:提供消息认证码算法。可以使用getInstance方法获取Mac对象,并选择合适的算法。然后,通过init方法传入密钥初始化Mac对象。最后,使用doFinal方法对数据进行消息认证,生成Mac码。
    示例:
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(secretKey);
    byte[] macBytes = mac.doFinal(data);
    
  6. KeyPairGenerator:用于生成非对称密钥对。可以使用getInstance方法获取KeyPairGenerator对象,并选择合适的加密算法。然后,使用initialize方法传递密钥长度和可选的随机源初始化密钥对生成器。最后,通过generateKeyPair方法生成非对称密钥对。
    示例:
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    keyPairGenerator.initialize(2048);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    

这些示例演示了如何使用JCE中的加密引擎。您可以根据自己的需求选择适当的加密算法和模式,并按照示例代码进行相应的初始化和操作。请注意,还需要进行适当的异常处理和密钥管理来保证安全性。

在这里插入图片描述

密码流

在这里插入图片描述

在Java安全中,CipherInputStream是一种基于密码的输入流,用于加密或解密数据流。它可以与其他输入流(如文件输入流或网络输入流)结合使用,将数据流加密或解密。

CipherInputStream使用javax.crypto.Cipher加密引擎来处理数据流的加密或解密操作。它接收一个已初始化的Cipher对象作为参数,并使用该Cipher对象来进行相应的加密或解密操作。

以下是CipherInputStream的说明和使用示例:

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.spec.SecretKeySpec;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.util.Base64;

public class CipherInputStreamExample {
    public static void main(String[] args) throws Exception {
        // 定义密钥
        String keyString = "0123456789ABCDEF";
        Key key = new SecretKeySpec(keyString.getBytes(), "AES");

        // 初始化加密引擎
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);

        // 创建输入流和输出流
        InputStream inputStream = new FileInputStream("input.txt");
        OutputStream outputStream = new FileOutputStream("output.txt");

        // 创建CipherInputStream
        CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher);

        // 读取加密的数据,并写入输出流
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = cipherInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }

        // 关闭流
        cipherInputStream.close();
        inputStream.close();
        outputStream.close();
    }
}

上述示例演示了使用CipherInputStream对数据流进行加密的过程。首先,我们定义了一个密钥(key),然后使用该密钥创建一个Cipher对象,指定加密算法和模式。接下来,我们创建一个输入流(FileInputStream)从源文件中读取数据,并创建一个输出流(FileOutputStream)将加密后的数据写入到目标文件中。然后,我们使用CipherInputStream来加密数据流,传入输入流和已初始化的Cipher对象。在while循环中从密文输入流读取加密数据,并将其写入到输出流中。最后,关闭流以释放资源。

通过类似的方式,您也可以使用CipherInputStream来进行数据流的解密操作,只需将Cipher对象的加密模式设置为Cipher.DECRYPT_MODE即可。

请注意,上述示例使用的是ECB模式和PKCS5Padding填充模式的AES加密算法,您可以根据需要选择其他支持的加密算法和模式。此外,为了保证数据安全性,建议使用更强大和安全的加密算法,并采取适当的密钥管理和安全措施。

加封对象

在这里插入图片描述

在Java安全中,“加封”(Sealing)是指将对象序列化并使用加密技术保护对象的完整性和机密性。通过加封对象,可以在不暴露敏感数据的情况下,将对象传输或存储到不可信的环境中。

Java中的加封对象可以使用javax.crypto.SealedObject类实现。该类在应用层上提供了对对象加密和解密的支持,以及对对象完整性的保护。

以下是加封对象在Java安全中的说明和使用示例:

import javax.crypto.*;
import java.io.Serializable;
import java.security.Key;
import java.util.Base64;

class MySecretData implements Serializable {
    // 加密和解密所需的共享密钥
    private static final Key sharedKey = ...;

    private String secretMessage;

    public MySecretData(String secretMessage) {
        this.secretMessage = secretMessage;
    }

    public String getSecretMessage() {
        return secretMessage;
    }

    // 加封对象
    public SealedObject seal() throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, sharedKey);

        return new SealedObject(this, cipher);
    }

    // 解开加封的对象
    public static MySecretData unseal(SealedObject sealedObject) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, sharedKey);

        return (MySecretData) sealedObject.getObject(cipher);
    }
}

public class SealedObjectExample {
    public static void main(String[] args) throws Exception {
        // 创建私密数据对象
        MySecretData secretData = new MySecretData("This is a secret message!");

        // 加封对象
        SealedObject sealedObject = secretData.seal();

        // 获取加封对象的密文表示
        byte[] sealedData = sealedObject.getEncoded();
        String sealedDataString = Base64.getEncoder().encodeToString(sealedData);

        System.out.println("Sealed Object: " + sealedDataString);

        // 解开加封的对象
        MySecretData unsealedData = MySecretData.unseal(sealedObject);

        // 获取解开的对象的信息
        String secretMessage = unsealedData.getSecretMessage();
        System.out.println("Unsealed Object: " + secretMessage);
    }
}
``

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

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

相关文章

Buffer Overflow缓冲区溢出和保护措施

缓冲区溢出是指当数据写入某个缓冲区(buffer)时,超出了为该缓冲区分配的内存空间,从而导致覆盖了相邻内存区域的情况。这种现象可能导致程序崩溃、数据损坏,甚至引发安全漏洞,允许攻击者利用这一漏洞执行恶…

Python程序开发——第十一章 图形用户页面编程

目录 一、图形用户界面与tkinter二、tkinter的根窗口(一)根窗口的创建(二)根窗口的基本方法 三、几何布局管理器(一)pack布局(二)grid布局(三)place布局 四、…

【Android】将手机屏幕投屏到电脑上控制的解决方案

有没有听说scrcpy呢,是投屏工具,通过它就可以实现把手机屏幕投屏到电脑上了,有此帮助,离实现目标更近了一步。 首先,去开源站点GitHub那里下载获取scrcpy 压缩包,根据自己的电脑系统选择下载即可&#xff…

NginxTomcat架构的动静分离和负载均衡

目录 一、Tomcat的多实例部署 1.创建 kgc 和 benet 项目目录和文件 2.修改 Tomcat 主配置文件 3.客户端浏览器访问验证 二、NginxTomcat负载均衡架构原理 2.1 Nginx负载均衡的主要配置 2.2 NginxTomcat负载均衡的优点 三、NginxTomcat负载均衡实验 1.部署Nginx 负载…

SNP受邀参加“赛意力量·全国行”相聚合肥,RISE with SAP

伴随着全球数字化程度的不断加深,IT和OT逐步走向原生融合,以价值链重构倒逼产业转型的结构升级趋势已日益明显。在旺盛的市场需求与机遇下,企业的IT投入涌现出爆发式增长态势,对于IT系统“高效支撑以保障业务先赢”的能力要求已不…

Linux——权限

1.Linux权限的概念 Linux权限是指用于限制对文件和目录的访问的安全机制。文件和目录的权限由三个部分组成:所有者权限、同组用户权限和其他用户权限。每个部分又包括读、写、执行三种权限。这些权限决定了用户能否对文件或目录进行读、写、执行等操作。 2.Linux…

MinGW编译OpenCV 过程记录

1.下载源码opencv-3.4.10.zip ,可以在OpenCV官网下载Releases - OpenCV 解压缩如下: 2.下载Mingw64工具,需要支持posix 并设置系统环境目录,下载的文件名x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z (可以在网上找) 3.使用Cmake工具构建…

Linux学习之分区和挂载磁盘配额

先分区然后格式化。 fdisk /dev/sdb开始分区。 输入p,然后按下Enter,可以查看当前设备的分区情况。 输入d,然后按下Enter,就可以删除上边的分区,要是有多个分区,会让你选择删除哪个分区。 输入n&…

MySQL注入-SQLi-Less3笔记

起手?id1给个参数看看反应 产生报错,关注后面的内容 //从报错信息中的1)就可以推断出SQL语句应该是WHERE XX(id)//那就需要考虑如何将 单引号和括号,提前关闭并且执行我们想要的语句就可以了 知道了语句,直接拼接 ?id1) and 12 union sel…

1。解释型语言和编译型语言

1、解释: 在计算机编程中,编译型语言和解释型语言是两种不同的语言类型。它们的主要区别在于代码的执行方式。编译型语言(Compiled Language)是指在程序运行之前需要经过编译器编译成可执行文件的语言。编译器会将编写好的代码转换…

基于matlab对于未校准立体图像校正(附源码)

一、前言 此示例说明如何计算两个未校准图像的校正,其中相机内禀函数未知。 立体图像校正将图像投影到公共图像平面上,以使相应的点具有相同的行坐标。此过程对于立体视觉很有用,因为 2-D 立体对应问题被简化为 1-D 问题。例如,…

java中跳出最外层的循环

public static void forTest() {int a 3;tab: for (int i 0; i < a; i) {System.out.println("我是i...." i);for (int j 0; j < a; j) {System.out.println("我是j...." j);if (j 1) {break tab;}}}}

linux用户权限相关内容查看

1 用户信息 创建用户一个名为 webuser 的账号&#xff0c;并填写相应的信息&#xff1a; rootiZ94fabhqhuZ:~# adduser webuser Adding user webuser ... Adding new group webuser (1000) ... Adding new user webuser (1000) with group webuser ... Creating home direc…

#systemverilog#进程控制问题#(三)进程监视

关于内建类:process SystemVerilog中内建了一种class,可以对进程进行访问和控制,此种class就是process,我们先来看下process类的原型: 图8 process类中定义了一个枚举变量state,表示当前进程的几种执行状态:FINISHED,RUNNING,WAITING,SUSPENDED,KILLED。 另外,还…

StarRocks--被 Databricks CEO 提及的数据库

Databricks 介绍 Databricks是一家美国的大数据独角兽公司&#xff0c;由 Apache Spark 的创建者所创立。Databricks 开源了 Delta Lake--基于 Apache Spark 的下一代数据湖存储引擎。Delta Lake 是目前市面上主流的数据湖存储引擎之一&#xff0c;与 Apache Hudi 和 Apache Ic…

十、less语法2

目录&#xff1a; 1.详解 1.详解 1.less 里面是可以直接进行数值运算 .box1{// 在less,所有数值都可以进行运算 &#xff0c;- * /width: 100px 100px;height:100px/2;background-color: #bfa;}2.在less中引入模块xx.less // import用来将其他的less引入到当前的less,相当于…

EasyCVR长时间运行后,级联到上级平台的通道无法播放是什么原因?

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持多协议、多类型的设备接入&#xff0c;可实现的功能包括&#xff1a;视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群以及平台级联等&am…

使echarts图例legend只选中一个(selectedMode)

例如&#xff1a;两个块选中第一个&#xff0c;第二个自动取消&#xff0c;选第二个&#xff0c;第一个取消 selectedMode: single,

有了PMP证书还有必要学习CSPM吗?CSPM含金量咋样?

建议学习&#xff0c;CSPM 相当于是 PMP 的本土化&#xff0c;是中国的项目管理&#xff0c;在中国自然还是本土的更适合国情&#xff0c;有CSPM还是更好找工作些。 CSPM认证6月1号才正式开启&#xff0c;现在是福利期&#xff0c;PMP持证者不用参加考试可以直接走换证流程&am…

Java【代码 16】Milvus向量库工具类和SeetaSDK获取人像向量和属性的工具类分享

Milvus向量库和SeetaSDK工具类分享 1.Milvus向量库工具类2.SeetaSDK工具类 1.Milvus向量库工具类 Milvus的Maven依赖&#xff1a; <dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.1.0<…