目录
一、编码算法
1、URL编码
2、Base64编码
二、常见的哈希算法总结
首页 Java java教程 Java加密与安全实例分析

Java加密与安全实例分析

Apr 26, 2023 am 08:04 AM
java

    一、编码算法

    常见的编码有ASCII码、Unicode编码。

    字母A的编码是十六进制的0x41,字母B是0x42,以此类推;ASCII只能用于英文编码,最多只能有127个字符。要想对更多的文字进行编码,就需要用占用两个字节的Unicode.而中文的“中”字使用Unicode编码就是0x4e2d,使用UTF-8则需要3个字节编码。

    所以,最简单的编码是直接给每个字符指定一个若干字节表示的整数,复杂一点的编码就需要根据已有的编码推算出来。比如UTF-8编码,它是一种不定长编码,但可以从给定字符的Unicode编码推算出来。

    1、URL编码

    1.1概念

    URL编码是浏览器发送给服务器时使用的编码,它通常附加在URL的参数部分,eg

    https://www.baidu.com/s?wd=%E6%9D%A8%E9%A2%96

    之所以需要URL编码,是因为处于兼容性考虑,很多服务器只识别ASCII字符。但如果URL中包含中文,日文这些非ASCII字符怎么办?URL编码有一套规则:

    ·如果字符是A~z,a~z, 0~9以及-,_,.,*,则保持不变;

    ·如果是其他字符,先转换为UTF-8编码,然后对每个字节以%xx表示。

    例如:字符"中"的UTF-8编码是0xe4b8ad,因此,它的URL编码是%E4%B8%AD。URL编码总是大写。

    1.2代码示例(编码和解码)

    对URL中的中文进行编码

    package com.yy.demo01;
     
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
     
    public class Test01 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String url  = "http://www.baidu.com/s?wd=";
            String value = "杨颖";
            
            //对URL中的中文进行编码
            String result = URLEncoder.encode(value, "utf-8");
            System.out.println("URL参数:" + result);
            System.out.println("完整网址:" + (url+result));
            
            
        }
     
    }
    登录后复制

    Java中的加密与安全实例分析

    对URL中的中文进行解码

    package com.yy.demo01;
     
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
     
    public class Test01 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            
            //对URL中的中文进行解码
            String param = "https://www.baidu.com/s?wd=
                         %E6%88%91%E6%9C%AC%E5%B0%86%E5%BF%83%E5%90%91%E6%98%8E%E6%9C%88\r\n";
            String conent = URLDecoder.decode(param, "utf-8");
            System.out.println(conent);
        }
     
    }
    登录后复制

    Java中的加密与安全实例分析

    注意:URL编码是编码算法,不是加密算法。

    URL编码目的:把任意文本数据编码为%前缀表示的文本,编码后的文本仅包含A-Z,a-z,0-9,-,_,.,*和%,便于浏览器和服务器处理。

    2、Base64编码

    2.1基本概念

    URL 编码是对字符进行编码,表示成%xx的形式,而Base64编码是对二进制数据进行编码,表示成文本格式。

    Base64编码可以把任意长度的二进制数据变为纯文本,并且纯文本内容中且只包含指定字符内容:A~2 .a~z、0~9、+、7、日。它的原理是把3字节的二进制数据按6bit一组,用4个int整数表示,然后查表,把int整数用索引对应到字符,得到的字符串。

    6位整数的范围总是e ~63,所以,能用64个字符表示:字符A~z 对应索引e~ 25,字符a~z对应索引26~5

    2.2在java中,二进制数据就是byte[ ] 数组、Java标准库提供Base64来对byte[ ]数组进行编码

    编码代码示例:使用Base64.getEncoder().encodeToString("xxxx".getBytes())方法进行编码(它返回值为一个字节数组,所以编码内容要转换为字节!)。

    Java中的加密与安全实例分析

    package com.yy.demo01;
     
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
     
    public class Test02 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String content = "红尘客栈风似刀,骤雨落宿命敲";
            String result = Base64.getEncoder().encodeToString(content.getBytes());
            System.out.println(result);
            
        }
     
    }
    登录后复制

    Java中的加密与安全实例分析

    解码内容

    使用Base64.getDecoder().decode(str)方法进行解码

    package com.yy.demo01;
     
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;
     
    public class Test02 {
        public static void main(String[] args) throws UnsupportedEncodingException {
            
            String str = "57qi5bCY5a6i5qCI6aOO5Ly85YiA77yM6aqk6Zuo6JC95a6/5ZG95pWy";
            byte[] byteArray = Base64.getDecoder().decode(str);
            String line = new String(byteArray,"utf-8");
            System.out.printf("解码后:" +line);
            
        }
     
    }
    登录后复制

    Java中的加密与安全实例分析

    2.3、用Base64进行图片的编码和解码

    先使用Files.readAllBytes(Paths.get("图片的本地路径"))读取图片的字节数组,然后使用Base64.getEncoder().encodeToString(读取到的图片的字节数组)来进行编码,转化成字符串类型。使用Base64.getDecoder().decode(图片的字符串)解码,Files.write()写入指定路径。

    package com.yy.demo01;
     
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.Base64;
     
    public class Test03 {
        public static void main(String[] args) throws IOException {
            //读取图片(字节数组)
            byte[] imageByteArray = Files.readAllBytes(Paths.get("C:\\Users\\LENOVO\\Pictures\\Saved Pictures\\QQ图片20220505163951.jpg"));
            
            //将字节数组进行Base64编码,转换成“字符串形式”
            String imageDataStr = Base64.getEncoder().encodeToString(imageByteArray);
            System.out.println(imageDataStr);
            
            //Base64解码
            byte[] imageResultByteArray = Base64.getDecoder().decode(imageDataStr);
            Files.write(Paths.get("D:\\1\\3\\难哄.jpg"), imageResultByteArray);
        }
     
    }
    登录后复制

    Java中的加密与安全实例分析

    2.4、从文本文件中读取Mp3文件

    package com.yy.demo01;
     
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.Base64;
    import java.util.List;
     
    public class Test05 {
        public static void main(String[] args) throws IOException {
            //从文本文件中读取Mp3文件
            List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\LENOVO\\Documents\\Tencent Files\\2452845234\\FileRecv\\mojito.txt"));
            
            StringBuilder sb = new StringBuilder();
            
            for(String ln : lines) {
                sb.append(ln);
            }
            
            //Base解码
            byte[] mp3ArrayBase = Base64.getDecoder().decode(sb.toString());
            Files.write(Paths.get("D:\\1\\3\\mojito.mp3"), mp3ArrayBase);
        }
     
    }
    登录后复制

    二、常见的哈希算法总结

    哈希算法(Hash)又称摘要算法(Digest),它的作业是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。哈希算法的目的是;为了验证原始数据是否被篡改。

    哈希算法最重要的特点就是:

    .相同的输入一定得到相同的输出

    .不同的输入大概率得到不同的输出

    Java字符串的hashCode()就是一个哈希算法输入是任意字符串,输出的是固定的4字节int整数;

    "hello".hashCode(); // 0x5e918d2
    "hello, java".hashCode(); // 0x7a9d88e8
    "hello, bob".hashCode(); // 0xa0dbae2f
    登录后复制

    哈希碰撞

    两个不同的输入得到了相同的输出:

    "AaAaAa".hashCode(); // 0x7460e8c0
    "BBAaBB".hashCode(); // 0x7460e8c0
     
    "通话".hashCode(); // 0x11ff03
    "重地".hashCode(); // 0x11ff03
    登录后复制

    常用哈希算法:MD

    Java中的加密与安全实例分析

    "MD5"算法加密普通字符串

    package com.yy.demo02;
     
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
     
    public class Test02 {
        public static void main(String[] args) {
            String passWord = "hckzfsd1";
            //7d18b6dc254c73427481f3083a3669
            //7d18b6dc254c734274810f30083a3669
            try {
                MessageDigest digest = MessageDigest.getInstance("MD5");
                digest.update(passWord.getBytes());
                
                byte[] resultByteArray = digest.digest();
                StringBuilder result = new StringBuilder();
                
                for(byte bite:resultByteArray) {
                    result.append(String.format("%02x", bite));
                }
                
                System.out.println(result);
                System.out.println(result.length());
                
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
     
    }
    登录后复制

    Java中的加密与安全实例分析

    MD5算法加密图片

    package com.yy.demo02;
     
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
     
    public class Test03 {
        public static void main(String[] args) {
            try {
                byte[] imageByteArray = Files.readAllBytes(Paths.get("D:\\1\\3\\周杰伦.jpg"));
                
                MessageDigest digest = MessageDigest.getInstance("MD5");
                digest.update(imageByteArray);
                
                byte[] resultByteArray = digest.digest();
                System.out.println(Arrays.toString(resultByteArray));
                System.out.println(resultByteArray.length);
                
                StringBuilder digestResult = new StringBuilder();
                for(byte b : resultByteArray) {
                    digestResult.append(String.format("%02x", b));
                }
                System.out.println(digestResult);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
    }
    登录后复制

    Java中的加密与安全实例分析

    "SHA-1"算法加密普通字符串

    package com.yy.demo02;
     
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    import java.util.UUID;
     
    public class Test04 {
        public static void main(String[] args) {
            String passWord = "wbjxxmy";
            String salt = UUID.randomUUID().toString().substring(0, 5);
            System.out.println(salt);
            
            try {
                MessageDigest digest = MessageDigest.getInstance("SHA-1");
                digest.update(passWord.getBytes());
                digest.update(salt.getBytes());
                
                byte[] resultByteArray = digest.digest();
                System.out.println(Arrays.toString(resultByteArray));
                System.out.println(resultByteArray.length);
                
                StringBuilder result = new StringBuilder();
                for(byte b : resultByteArray) {
                    result.append(String.format("%02x", b));
                }
                System.out.println(result);
                
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
        
     
    }
    登录后复制

    "HmacMD5"加密普通字符串

    package com.yy.demo02;
     
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
     
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
     
    public class Test06 {
        public static void main(String[] args) {
            String passWord = "zylsmq";
            try {
                //1.生成秘钥
                //秘钥生成器KeyGenerator
                KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
                
                //生成秘钥
                SecretKey key = keyGen.generateKey();
                
                //获取秘钥key的字节数组(64)
                byte[] keyByteArray = key.getEncoded();
                System.out.println("秘钥字节数组:" + Arrays.toString(keyByteArray));
                System.out.println("秘钥长度:" + keyByteArray.length);
                
                StringBuilder keyByteResult = new StringBuilder();
                for(byte b : keyByteArray) {
                    keyByteResult.append(String.format("%02x", b));
                }
                System.out.println(keyByteResult);
                
                
                //2.加密
                Mac mac = Mac.getInstance("HmacMD5");
                
                mac.init(key);
                
                //更新原始内容
                mac.update(passWord.getBytes());
                
                //加密
                byte[] resultByteArray = mac.doFinal();
                System.out.println("加密结果:" + resultByteArray.length + "字节");
                
                StringBuilder resultStr = new StringBuilder();
                for(byte b : resultByteArray) {
                    resultStr.append(String.format("%02x", b));
                }
                System.out.println("加密结果:" + resultStr);
                System.out.println("加密结果长度" + resultStr.length());
                
                
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            }
        }
     
    }
    登录后复制

    以上是Java加密与安全实例分析的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热门文章

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    热门话题

    Java教程
    1677
    14
    CakePHP 教程
    1431
    52
    Laravel 教程
    1334
    25
    PHP教程
    1280
    29
    C# 教程
    1257
    24
    作曲家:通过AI的帮助开发PHP 作曲家:通过AI的帮助开发PHP Apr 29, 2025 am 12:27 AM

    AI可以帮助优化Composer的使用,具体方法包括:1.依赖管理优化:AI分析依赖关系,建议最佳版本组合,减少冲突。2.自动化代码生成:AI生成符合最佳实践的composer.json文件。3.代码质量提升:AI检测潜在问题,提供优化建议,提高代码质量。这些方法通过机器学习和自然语言处理技术实现,帮助开发者提高效率和代码质量。

    如何使用MySQL的函数进行数据处理和计算 如何使用MySQL的函数进行数据处理和计算 Apr 29, 2025 pm 04:21 PM

    MySQL函数可用于数据处理和计算。1.基本用法包括字符串处理、日期计算和数学运算。2.高级用法涉及结合多个函数实现复杂操作。3.性能优化需避免在WHERE子句中使用函数,并使用GROUPBY和临时表。

    MySQL的字符集和排序规则如何配置 MySQL的字符集和排序规则如何配置 Apr 29, 2025 pm 04:06 PM

    在MySQL中配置字符集和排序规则的方法包括:1.设置服务器级别的字符集和排序规则:SETNAMES'utf8';SETCHARACTERSETutf8;SETCOLLATION_CONNECTION='utf8_general_ci';2.创建使用特定字符集和排序规则的数据库:CREATEDATABASEexample_dbCHARACTERSETutf8COLLATEutf8_general_ci;3.创建表时指定字符集和排序规则:CREATETABLEexample_table(idINT

    如何在MySQL中重命名数据库 如何在MySQL中重命名数据库 Apr 29, 2025 pm 04:00 PM

    MySQL中重命名数据库需要通过间接方法实现。步骤如下:1.创建新数据库;2.使用mysqldump导出旧数据库;3.将数据导入新数据库;4.删除旧数据库。

    如何在C  中实现单例模式? 如何在C 中实现单例模式? Apr 28, 2025 pm 10:03 PM

    在C 中实现单例模式可以通过静态成员变量和静态成员函数来确保类只有一个实例。具体步骤包括:1.使用私有构造函数和删除拷贝构造函数及赋值操作符,防止外部直接实例化。2.通过静态方法getInstance提供全局访问点,确保只创建一个实例。3.为了线程安全,可以使用双重检查锁定模式。4.使用智能指针如std::shared_ptr来避免内存泄漏。5.对于高性能需求,可以使用静态局部变量实现。需要注意的是,单例模式可能导致全局状态的滥用,建议谨慎使用并考虑替代方案。

    考虑到平台独立性,Java在物联网(物联网)设备的开发中扮演什么角色? 考虑到平台独立性,Java在物联网(物联网)设备的开发中扮演什么角色? May 03, 2025 am 12:22 AM

    JavaplaysigantroleiniotduetoitsplatFormentence.1)itallowscodeTobewrittenOnCeandrunonVariousDevices.2)Java'secosystemprovidesuseusefidesusefidesulylibrariesforiot.3)

    将Java用于需要在不同服务器上运行的Web应用程序的优点是什么? 将Java用于需要在不同服务器上运行的Web应用程序的优点是什么? May 03, 2025 am 12:13 AM

    Java适合开发跨服务器web应用。1)Java的“一次编写,到处运行”哲学使其代码可在任何支持JVM的平台上运行。2)Java拥有丰富的生态系统,包括Spring和Hibernate等工具,简化开发过程。3)Java在性能和安全性方面表现出色,提供高效的内存管理和强大的安全保障。

    怎样设置 HTML 元素的旋转效果 怎样设置 HTML 元素的旋转效果 Apr 30, 2025 pm 02:42 PM

    如何在HTML中设置元素的旋转效果?使用CSS和JavaScript可以实现。1.CSS的transform属性用于静态旋转,如rotate(45deg)。2.JavaScript可动态控制旋转,通过改变transform属性实现。

    See all articles