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

这篇具有很好参考价值的文章主要介绍了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安全——基于密码的加密,JavaBasic knowledge & ME & GPT,Security & ME & GPT,java,安全

密码流

Java安全——基于密码的加密,JavaBasic knowledge & ME & GPT,Security & ME & GPT,java,安全

在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安全——基于密码的加密,JavaBasic knowledge & ME & GPT,Security & ME & GPT,java,安全

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

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

以下是加封对象在Java安全中的说明和使用示例:文章来源地址https://www.toymoban.com/news/detail-545394.html

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);
    }
}
``

到了这里,关于Java安全——基于密码的加密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于des双重加密算法的安全web电子邮件系统的设计与实现(论文+源码)_java_285

    摘要 本文首先研究并介绍国内外目前的背景和现状,在此基础上给出论文的主要研究内容,其次,对双重加密算法的电子邮件系统的需求进行了分析。再次,对双重加密算法的电子邮件系统进行了总体设计,根据其总体设计、软件架构和总体功能模块进行了详细设计,作出了

    2024年02月04日
    浏览(58)
  • 前后端分离------后端创建笔记(09)密码加密网络安全

    本文章转载于【SpringBoot+Vue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/1ZZ8c-kRPUxY6FWzsoOOjtA 提取码:up4c 项目概述笔记:https://blog.c

    2024年02月12日
    浏览(52)
  • Java 密码加密

    【这里将军采用的是MD5算法加密】 对密码进行加密,可以有效的保障密码安全,即使出现数据库泄密,密码安全也不会受到影响!为了实现此目标,需要在对密码进行加密时,使用不可逆的算法进行处理! 通常,不可以使用加密算法对密码进行加密码处理,从严格定义上来

    2024年02月05日
    浏览(37)
  • 每日网站逆向练习:day4 某安全中心登录密码加密

    某安全中心网站登录载荷中有2个参数需要破解 首先这个aws直接就是送的,不管是多试几次或者是直接去看他的方法,都可以发现这个值是写死的 不过点进去看他的方法好像也不简单,不过既然是写死的就不管他了 我们搜索后发现竟然只有一处,而且还并不是在对它赋值 不

    2024年02月05日
    浏览(61)
  • 密码学【java】初探究加密方式之非对称加密

    非对称加密算法又称现代加密算法。非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey) 和私有密(privatekey) 公开密钥和私有密钥是一对。如果用公开密钥对数据进行加密,只有用对应的

    2024年02月03日
    浏览(53)
  • 【网络安全】数据加密标准(DES算法)详细介绍( 分组密码、Feistel密码结构、轮函数、子密钥生成算法)

    将被加密明文划分成一个一个的分组,输入n比特明文分组,输出n比特密文分组。 若映射可逆,具有 x n ! x^n! x n ! 种替换可能性。 如以下示例,每个4比特输入唯一映射为另一个4比特输出。 2.1 什么是Feistel密码结构 1973年由 IBM的Horst Feistel首次提出 ,通过将明文分组分成 左右

    2023年04月08日
    浏览(43)
  • 若依基于jsencrypt实现前后端登录密码加密

    若依虽然有加密解密功能,然后只有前端有,在用户点击保存密码的时候,会将密码保存到本地,但是为了防止密码泄露,所以在保存的时候,进行加密,在回显密码的时候进行解密显示,用户在登录的时候密码照样会明文传输,我们可以使用,为了解决这个问题,我们可以

    2024年01月17日
    浏览(47)
  • 商用密码应用与安全性评估要点笔记(SM2公钥加密算法)

    1、SM2算法简介         SM2密码算法是我国2010年发布的商用密码算法,属于公钥密码算法,也成为非对称密钥机制密码算法。SM2基于椭圆曲线离散对数问题,相对于RSA基于大整数因数分解更具优越性。         SM2算法于2012年成为我国密码行业标准,并于2017年被ISO采纳,成为

    2024年02月01日
    浏览(45)
  • 云上攻防-云原生篇&;Kubernetes&;K8s安全&;API&;Kubelet未授权访问&;容器执行

    curl -XPOST -k “https://192.168.139.132:10250/run///” -d “cmd=id” 执行的命令是test03容器里的命令,需要进行容器逃逸。 1、攻击8080端口:API Server(Master)未授权访问 旧版本的k8s的API Server默认会开启两个端口:8080和6443。 6443是安全端口,安全端口使用TLS加密;但是8080端口无需认证,

    2024年04月22日
    浏览(77)
  • 基于【GO】的cmf_password加密密码的逻辑,和校验密码逻辑

    导入必要的包: 这里导入了一些标准库的包,用于生成随机数、计算SHA-256哈希和处理十六进制编码。 main 函数: 在 main 函数中,首先定义了要加密的原始密码 password 。 使用 generateSalt 函数生成一个随机的盐值 salt 。 然后,使用 hashPassword 函数将原始密码和盐值一起加密,生

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包