`
szlxh002
  • 浏览: 34442 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java常用的安全算法

    博客分类:
  • java
 
阅读更多

    安全算法主要包括 摘要算法、对称加密算法、非对称加密算法、信息编码以及数字签名、数字证书。

1.数字摘要

     数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,由一个单向Hash函数对消息进行计算而产生的。其生产过程如下图所示:



 有如下特点:

(1)无论输入的消息有多长,计算出来的消息摘要的长度是固定的。应用MD5,计算出长度是128个比特位,使用SHA-1算法计算出来是160个比特位;

(2)只能进行正向的信息摘要,而无法从摘要中恢复出原来的消息。

常用的算法:

MD5及SHA算法。

 java例子:

public class DigestTest {
    public static byte[] testMD5(String content) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] bytes = md.digest(content.getBytes("UTF-8"));
        return bytes;
    }

    public static byte[] testSHA1(String content) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA1");
        byte[] bytes = md.digest(content.getBytes("UTF-8"));
        return bytes;
    }

    public static void main(String args[]) throws Exception {
        String content = "123";
        byte[] bytes =  testMD5(content);
        String digest = DatatypeConverter.printHexBinary(bytes);
        System.out.println(digest);

        bytes =  testSHA1(content);
        digest = DatatypeConverter.printHexBinary(bytes);
        System.out.println(digest);
    }

}

 2.对称加密算法

      在对称加密算法中,数据发送方将明文和加密密钥经过特殊加密算法处理后,生成复杂的加密密文进行发送,数据接收方收到密文后,必须用相同的算法及密钥时行解密。其过程如下:



 特点是算法公开、计算量小、加密速度快,加密效率高。

常用的加密算法包括:DES算法、3DES算法、AES算法。

 

Java例子:

 

AES对称算法加密:(用DES算法,只需要把AES改成DES即可)

public class AESTest {
    public static String genKeyAES() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        SecretKey key = keyGenerator.generateKey();
        String base64Key =  DatatypeConverter.printBase64Binary(key.getEncoded());
        return base64Key;
    }
    public static SecretKey loadKeyAES(String base64Key){
        byte[] bytes = DatatypeConverter.parseBase64Binary(base64Key);
        SecretKey key = new SecretKeySpec(bytes, "AES");
        return key;
    }

    public static byte[] encryptDES(byte[] source, SecretKey key) throws Exception {
        Cipher ciper = Cipher.getInstance("AES");
        ciper.init(Cipher.ENCRYPT_MODE, key);
        byte[] bytes = ciper.doFinal(source);
        return bytes;
    }

    public static byte[] decrytDES(byte[] source, SecretKey key) throws Exception{
        Cipher ciper = Cipher.getInstance("AES");
        ciper.init(Cipher.DECRYPT_MODE, key);
        byte[] bytes = ciper.doFinal(source);
        return bytes;
    }

    public static void main(String args[]) throws Exception {
        String test = "1234";
        String content = genKeyAES();//"12345678901234567890123456789012";
        System.out.println(content);

        SecretKey secretKey = loadKeyAES(content);

        byte bytes[] =  encryptDES(test.getBytes(), secretKey);
        System.out.println("secretKey String:" + DatatypeConverter.printHexBinary(bytes));

        bytes = decrytDES (bytes, secretKey);
        System.out.println("decrytDES String:" + new String(bytes));


    }
}

 

3.非对称加密算法

 

    又称为公开密钥加密算法,需要两个密钥,一个是公开密钥(public key),一个是私有密钥(private key),公钥和私钥需要配对使用。

    基本过程:甲方生成一对密钥,并将其中的一把作为公钥向其他人公开,得到该公钥的乙方使用该密钥对机密信息进行加密后再发送给甲方,甲方再使用自己保存的另一把密钥(即私钥)对加密后的信息进行解密。如下图所示:



 

常用的算法:RSA算法

 

JAVA的例子:

public class RSATest {
    public static KeyPair getKeyPairt() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(512);
        return keyPairGenerator.generateKeyPair();
    }
    public static String getPublicKey(KeyPair keyPair){
        PublicKey publicKey = keyPair.getPublic();
        byte[] bytes = publicKey.getEncoded();
        return DatatypeConverter.printBase64Binary(bytes);
    }
    public static String getPrivateKey(KeyPair keyPair){
        PrivateKey privateKey = keyPair.getPrivate();
        byte[] bytes = privateKey.getEncoded();
        return DatatypeConverter.printBase64Binary(bytes);
    }
    public static PublicKey String2Publickey(String pubStr) throws Exception {
        byte[] bytes = DatatypeConverter.parseBase64Binary(pubStr);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
        KeyFactory  keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }
    public static PrivateKey String2Privatekey(String privateStr) throws Exception {
        byte[] bytes = DatatypeConverter.parseBase64Binary(privateStr);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
        KeyFactory  keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privatekey = keyFactory.generatePrivate(keySpec);
        return privatekey;
    }

    public static byte[] publicEncrypt(byte[] content, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(content);
    }

    public static byte[] privateEncrypt(byte[] content,  PrivateKey privatekey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privatekey);
        return cipher.doFinal(content);
    }

    public static byte[] publicDecrypt(byte[] content, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        return cipher.doFinal(content);
    }
    public static byte[] privateDecrypt(byte[] content, PrivateKey privatekey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privatekey);
        return cipher.doFinal(content);
    }


    public static void main(String[] args) throws Exception {
        String str = "Hello, I am lai xiao hong";
        byte[] bytes = str.getBytes();
        KeyPair keyPair = getKeyPairt();
        String publicKey = getPublicKey(keyPair);
        String privateKey = getPrivateKey(keyPair);
        System.out.println("publicKey:" + publicKey);
        System.out.println("privateKey:" + privateKey);

        //byte[] encBytes = publicEncrypt(bytes, String2Publickey(publicKey));
        //byte[] decBytes = privateDecrypt(encBytes,String2Privatekey(privateKey));
        byte[] encBytes = privateEncrypt(bytes, String2Privatekey(privateKey));
        byte[] decBytes = publicDecrypt(encBytes, String2Publickey(publicKey));

        System.out.println("Decrypt String:" + new String(decBytes));

    }
}

 

4.数字签名

 

    签名认证是对非对称加密技术和数字摘要技术的综合运用,指的是将通信内容的商要信息使用发送者的私钥进行加密,然后将密文与原文一起传输给信息的接收者,接收者通过发送者的公钥解密被加密的摘要信息,然后使用与发送者相同的摘要算法,对接收的内容采用相同的方式产生摘要串,与解密的摘要串进行对比,如果相同,则说明接收到的内容是完整的,在传输过程中没有受到第五方篡改,否则说明通信内容已被第三方修改。

 

    只有信息的发送者才能产生别人无法篡改的数字签名串,这个串能对信息发送者所发送的内容完整 性和发送者的身份进行校验和签别,通信正文经过相应的摘要算法生成摘要后,使用消息发送者的私钥进行加密,生成数字签名如下图所示:



 

    消息的接收端收到信息的正文和对应的数字签名后,使用与发送端相同的摘要算法,生成通信正文的摘要,并且使用发送者的公钥对数字签名进行解密,得到发送商生成的摘要,进行比较后即可验证发送者的身份是否合法,正文内容是否被篡改,如下图所示:



 

 常风的数字数字签名算法包括:MD%withRSA、SHA1withRSA等.

 

java 例子:

public class SignatureTest {
    private static byte[] sign(byte[] content, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance("MD5withRSA");
        signature.initSign(privateKey);
        signature.update(content);
        return  signature.sign();
    }
    private static boolean verify(byte[] content,byte[] sign, PublicKey publicKey)  throws Exception{
        Signature signature = Signature.getInstance("MD5withRSA");
        signature.initVerify(publicKey);
        signature.update(content);
        return signature.verify(sign);
    }
}

 

5.数字证书

 

    也称为电子证书,通常包含如下内容:

  • 对象的名称
  • 证书的过期时间
  • 颁发机构
  • 签名算法
  • 对象的公钥

    大多数证书采用X.509的格式来保存证书,数字证书的签发过程实际上就是对数字证书的内容,包括证书所代表对象的公钥进行数字签名,而验证证书的过程,实际上是检验证书的数字签名。

    在现实中,网络用户的数字证书需要数字认证机构(Certificate Authority,CA)来进行颁发,只有经过CA颁布的数字证书在网络中才具备认证性。

证书的生成过程如下:



 

证书的验证过程如下:




 
     要获得数字证书,首先需要使用数字证书管理工具,如keytool,OpenSSL等,然后构建CSR(Certificate Signing Request)数字证书签发申请,提交给数字证书认证机构进行签名,最终形成数字证书。

  • 大小: 217.1 KB
  • 大小: 573.7 KB
  • 大小: 676.4 KB
  • 大小: 362.1 KB
  • 大小: 1.1 MB
  • 大小: 2.3 MB
  • 大小: 174.5 KB
分享到:
评论

相关推荐

    Java 常用数值算法集

    Java中常用的根查找算法有二分法、牛顿-拉弗森方法和Bisection法。Apache Commons Math提供了这些方法的实现。 九、排序与搜索算法 数值算法也涵盖了排序和搜索算法,如快速排序、归并排序、二分查找等。这些算法...

    Java中常用的加密算法应用

    Java中的加密算法在信息安全领域扮演着重要角色,用于保护数据的隐私性和完整性。本文将详细介绍在Java中常见的三种加密算法:MD5、SHA以及RSA,并探讨它们的应用场景和实现方式。 1. MD5(Message-Digest ...

    常用的hash算法(java实现)

    本篇文章将详细讨论几种常见的哈希算法及其在Java中的实现。 1. **MD5(Message-Digest Algorithm 5)** MD5是一种广泛使用的哈希函数,产生128位(16字节)的哈希值,通常表示为32个十六进制数字。尽管MD5在安全...

    Java面试常用数据结构与算法

    8. **常用算法**:除了上述数据结构,面试还会涉及排序、查找、图论、动态规划、贪心算法等经典算法。例如,快速排序、归并排序、二分查找、KMP字符串匹配、最小生成树(Prim或Kruskal)、最短路径(Dijkstra或...

    java实现常用算法

    - **类与对象**:在Java中,可以创建类来封装算法,通过对象的方法来执行算法操作,这样代码更具有可读性和可维护性。 - **泛型**:Java的泛型允许我们在编写代码时指定容器(如List、Set、Map等)所容纳的对象...

    Java中常用的加密算法MD5,SHA,RSA

    Java 中常用的加密算法 MD5,SHA,RSA Java 中常用的加密算法有多种,包括 MD5、SHA 和 RSA 等,这些算法在不同的应用场景中发挥着重要作用。下面将对这些算法进行详细的介绍和分析。 一、MD5 加密算法 MD5...

    java常用几种加密算法

    ### Java常用几种加密算法 在Java开发中,数据的...以上就是关于Java中常用的几种加密算法——MD5、SHA及RSA的基本介绍和应用示例。通过理解这些加密算法的工作原理和应用场景,可以帮助开发者更好地保护数据安全。

    java常用加解密算法

    本文将深入探讨Java中常用的两种加密算法:对称加密和非对称加密,并特别关注DE和RSA这两种算法。 首先,我们来看对称加密。对称加密是最基础的加密方式,其特点是加密和解密使用同一密钥。在Java中,DES(Data ...

    java加密算法实现

    本文将详细介绍Java中常见的加密算法的实现,以及如何在JDK 1.8环境下进行操作。 1. **对称加密算法** 对称加密是最基础的加密方式,使用相同的密钥进行加密和解密。Java中提供了`javax.crypto`包来支持此类算法,...

    常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES.pdf

    2. 在Java中实现对称加密算法,需要掌握如何使用Java加密扩展(Java Cryptography Extension, JCE),这是一套加密算法API,可以方便地在Java程序中集成加密功能。 对DES算法而言,它是一个对称密钥的块加密算法,...

    常用java加密解密算法

    在Java中,上述提到的加密算法都可以通过java.security包以及javax.crypto包中的相关类来实现。开发者在使用这些类时,需要考虑算法的适用场景以及安全性因素,合理选择对称或非对称加密算法,以及选择哪种加密强度...

    Java中常用的加密算法RSA

    这个压缩包文件"Java中常用的加密算法RSA.doc"可能包含更详细的内容,如具体的代码示例、原理解释或应用场景分析。对于学习和理解Java中的RSA加密算法,阅读这份文档会是一个很好的资源。无论你是初学者还是有经验的...

    Java中常用的加密算法及其实现原理详解-保护信息的铠甲,静默守护你的隐私

     本篇文章将详细介绍Java中常用的加密算法及其实现原理。我们将首先介绍对称加密算法,包括DES、AES和RC4。然后,我们将介绍非对称加密算法,包括RSA和DSA。继而,我们将介绍散列算法,包括MD5和SHA,最后,我们将...

    Java数据结构和算法

    在Java中,数组可以是一维、二维或多维的。理解数组的索引、遍历以及如何在数组中搜索和排序元素是基础。 2. **链表**:链表由节点组成,每个节点包含数据和指向下一个节点的引用。与数组相比,链表插入和删除操作...

    Java 常用算法实现

    以上就是Java中常见的排序算法实现,每种算法都有其适用场景和优缺点。了解和掌握这些算法,能够帮助开发者在实际工作中根据需求选择合适的排序方法,提高程序性能。在实际项目中,还需要考虑算法的时间复杂度、空间...

    自己整理的Java实现加解密算法

    在Java中,`java.security.MessageDigest`类可以用来实现MD5计算。通过创建MD5实例,更新输入数据,然后获取哈希值,可以实现对数据的不可逆加密,常用于密码存储或文件校验。 其次,DES(Data Encryption Standard...

    java 加密算法及原理.jar

    在Java中,我们可以使用多种加密算法来实现数据的安全传输和存储。以下将详细介绍几种常见的Java加密算法及其工作原理。 1. **对称加密算法** 对称加密算法使用相同的密钥进行加密和解密,速度快,效率高,适合...

    JAVA上加密算法的实现用例

    `JAVA上加密算法的实现用例`这个主题涵盖了Java中加密算法的基本概念、常用的加密库以及具体的代码示例。 首先,Java提供了一个内置的加密库,名为Java Cryptography Extension (JCE),它允许开发者使用各种加密...

    java加密算法及常用知识学习杂记

    在Java中,可以结合HTTP、HTTPS等协议,以及JSON、XML等数据格式,配合加密算法实现安全的数据同步。 5. **学习杂记**:学习加密算法不仅需要理解算法原理,还要熟悉Java提供的加密API。实践是提升技能的关键,通过...

    java数据结构和算法图形演示操作--使用javaapplet进行演示

    在Java中,常用算法包括排序(冒泡排序、选择排序、插入排序、快速排序、归并排序等)、查找(线性查找、二分查找)、图遍历(深度优先搜索、广度优先搜索)等。这些算法的效率通常用时间复杂度和空间复杂度来衡量,...

Global site tag (gtag.js) - Google Analytics