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

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");// 创建CipherInputStreamCipherInputStream 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.hqwc.cn/news/18860.html

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

相关文章

走进Linux世界【二、VM与Linux安装】

第二章 VM与Linux安装 1、安装VMware ​ 这里安装Vm主要是为了安装Linux系统,除了相对云服务器,比较大众化的操作,当然更多的是熟悉Linux操作 1、Windows安装 ​ (1) 下载链接,目前版本上下载VM15的版本即可https://www.vmwar…

两个分数比较大小

解决问题: 对于分子和分母的数据范围过大 导致化成小数进行比较大小的时候 存在精度丢失,不能比较的情况 为此进行算式变形推出 故采用如下自定义函数: ll bj(ll fz1,ll fm1,ll fz2,ll fm2){//分母相等if(fm1 fm2){return fz1-fz2;}//分…

GPT(Generative Pre-Training)论文解读及实现(一)

1 GPT Framework 1.1 Unsupervised pre-training Given an unsupervised corpus of tokens U {u1, . . . , un}, we use a standard language modeling objective to maximize the following likelihood: 在给定语料上下文环境下,目标时最大化下面的语言模型&…

3d Max中的Arnold渲染为黑色,这样处理!

使用Arnold渲染视图(ARV)时,图像保持黑色。 快照功能和常规3ds Max渲染设置可按预期生成图像。 解决方案: 解决方案可能需要执行下面的一项或多项操作: 添加光源 检查场景文件是否包含光源。如果场景中没有光源,渲染结果为黑色…

vue中使用v-for实现两次嵌套循环,判断某子元素是否显示,进行复杂表单校验

一、需求场景: 有以下一个使用场景,名称111、名称222、名称333,是放在一个大数组里的,然后通过第一层for循环显示出来的。名称333数组里又包含自己的子数组,子数组再通过第二次for循环展示出来。当我们选择发放方式的…

Linux(驱动编程)(调试技术)(imx6ull)

调试技术 1、在写驱动程序时函数未包含头文件 在linux内核源码driver/char目录下输入命令 grep “XXXX” * -nrw查看次函数在那个.c里用过,然后在vscode界面下按altp搜索这个.c就可以参考这个.c的头文件。 2、编译完驱动跟应用后先 insmod xxx.ko //插入 cat /…

4.9 x64dbg 内存处理与差异对比

LyScript 插件中针对内存读写函数的封装功能并不多,只提供了最基本的内存读取和内存写入系列函数的封装,本章将继续对API接口进行封装,实现一些在软件逆向分析中非常实用的功能,例如ShellCode代码写出与置入,内存交换&…

Nativefier 将网站打包成桌面程序

Nativefier是一个命令行工具,仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序 1 Mac 电脑 安装Nativefier 打开终端 npm install nativefier -g2 创建一个桌面应用程序: nativefier "https://biglead.blog.csdn.net/article/details…

Pytorch基本使用—激活函数

✨1 介绍 ⛄ 1.1 概念 激活函数是神经网络中的一种数学函数,它被应用于神经元的输出,以决定神经元是否应该被激活并传递信号给下一层。常见的激活函数包括Sigmoid函数、ReLU函数、Tanh函数等。 🎄 1.2 性质 激活函数是神经网络中的一种重…

RFID系统的部署流程和关键环节

RFID系统的部署与集成对于实现高效的物流管理、提升运营效益和实现自动化过程至关重要。本文将为您解释RFID系统的部署流程和关键环节,并探讨RFID系统与现有IT基础设施的集成方式。我们还将提供RFID系统部署和集成中常见问题的解决方案,帮助您制定RFID系…

ELK日志分析系统

目录 开始 第一台安装elasticsearch-head插件 第一台node1安装logstash 配置收集系统日志 第一台 安装kibana第一台 第三台 简述: 日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运…

cesium 实现多颗卫星与多颗地面站雷达通信效果

最主要的部分是计算空间内两点之间的距离以及卫星对地点是否在雷达扫描范围内 先看效果 1.计算空间内两点之间的距离 //计算距离 function distance(point1, point2) {var point1cartographic = Cesium.Cartographic.fromCartesian(point1);var</