首页 > 编程语言 >【Java教程】Day14-01 加密与安全:从ASCII到Base64

【Java教程】Day14-01 加密与安全:从ASCII到Base64

时间:2025-01-01 16:28:09浏览次数:7  
标签:编码 01 UTF 字符 URL Base64 Day14 ASCII

​1. 什么是编码?

在计算机科学中,编码(Encoding)是将信息从一种格式转换成另一种格式的过程。在我们日常生活中,编码算法广泛应用于文本、文件和网络传输等领域。了解编码的基础知识是学习计算机编程与算法的第一步。

1.1 ASCII编码

ASCII(American Standard Code for Information Interchange)码是一种常见的字符编码方案,用于表示英文字符及一些控制字符。例如:

字符ASCII编码
A0x41
B0x42
C0x43
D0x44
......

ASCII编码只能表示128个字符,限制了其对更多字符集(如中文、符号等)的支持。因此,针对更广泛的字符集,需要使用Unicode编码。

2. Unicode与UTF-8编码

2.1 Unicode编码

Unicode编码是一种全球标准字符集,旨在为每一个字符分配一个唯一的编码点(code point)。Unicode能够表示所有语言的字符,包括中文、日文、阿拉伯文等。例如:

汉字Unicode编码
0x4e2d
0x6587
0x7f16
0x7801

2.2 UTF-8编码

UTF-8是Unicode的一种变长编码方案,它将Unicode字符编码为1到4个字节。UTF-8编码兼容ASCII,因此ASCII字符和UTF-8编码的前128个字符是一样的。例如:

汉字Unicode编码UTF-8编码
0x4e2d0xe4b8ad
0x65870xe69687
0x7f160xe7bc96
0x78010xe7a081

UTF-8的优势是兼容性强,能够节省存储空间,特别是对英文字符。

3. URL编码

URL编码用于将数据转换为符合URL标准的格式,特别是用于HTTP请求中。例如:

  • 中文字符、空格、特殊符号等都需要进行URL编码。

  • 浏览器与服务器通常只支持ASCII字符,所以对于非ASCII字符,必须进行转码。

3.1 URL编码规则

URL编码将不在ASCII字符集中的字符转换为UTF-8编码,并用%XX表示每个字节。例如:

  • 字符“中”的UTF-8编码是0xe4b8ad,其URL编码为%E4%B8%AD

  • 字符“文”的UTF-8编码是0xe69687,其URL编码为%E6%96%87

Java中可以使用URLEncoder类进行URL编码:

javaimport java.net.URLEncoder;import java.nio.charset.StandardCharsets;public class Main {    public static void main(String[] args) {        String encoded = URLEncoder.encode("中文!", StandardCharsets.UTF_8);        System.out.println(encoded);    }}

运行结果为:

perl%E4%B8%AD%E6%96%87%21

3.2 URL解码

URL解码则是将编码后的URL字符串还原为原始字符串。可以使用URLDecoder类进行解码:

javaimport java.net.URLDecoder;import java.nio.charset.StandardCharsets;public class Main {    public static void main(String[] args) {        String decoded = URLDecoder.decode("%E4%B8%AD%E6%96%87%21", StandardCharsets.UTF_8);        System.out.println(decoded);    }}

4. Base64编码

Base64是一种编码算法,主要用于将二进制数据编码为文本格式。它将三个字节的二进制数据按6位分组,得到四个字符。Base64编码只包含AZ、az、0~9、+、/等字符,因此可以安全地在文本环境中传输二进制数据。

4.1 Base64编码原理

例如,输入数据为三个字节:

  • 0xe4、0xb8、0xad

将其按6位分组得到的结果是:

111001 000110 010011 100100

根据Base64编码表,分别映射到字符:

rust39 -> e40b -> b822 -> ad2d -> ...

4.2 Java实现Base64编码

Java提供了Base64类来对二进制数据进行编码和解码。例如:

javaimport java.util.*;public class Main {    public static void main(String[] args) {        byte[] input = new byte[] { (byte) 0xe4, (byte) 0xb8, (byte) 0xad };        String b64encoded = Base64.getEncoder().encodeToString(input);        System.out.println(b64encoded);    }}

运行结果为:

5Lit

4.3 Base64解码

对于Base64编码后的字符串,可以通过Base64类的解码功能进行还原:

javaimport java.util.*;public class Main {    public static void main(String[] args) {        byte[] output = Base64.getDecoder().decode("5Lit");        System.out.println(Arrays.toString(output)); // [-28, -72, -83]    }}

4.4 Base64的变种——URL编码

由于+/这两个字符可能在URL中产生冲突,因此在URL中传输Base64编码时,我们需要使用URL安全的Base64编码:

javaimport java.util.*;public class Main {    public static void main(String[] args) {        byte[] input = new byte[] { 0x01, 0x02, 0x7f, 0x00 };        String b64encoded = Base64.getUrlEncoder().encodeToString(input);        System.out.println(b64encoded);        byte[] output = Base64.getUrlDecoder().decode(b64encoded);        System.out.println(Arrays.toString(output));    }}

5. 总结

  • URL编码Base64编码都是常见的编码算法,但它们的用途和原理不同。

    • URL编码主要用于将文本转化为适合URL传输的格式,确保字符能被浏览器和服务器识别。

    • Base64编码则用于将二进制数据转换为文本形式,以便通过文本协议(如邮件、HTTP)传输。

  • 两者的区别在于:URL编码处理的是字符数据,Base64编码则处理二进制数据。在实际应用中,它们有着广泛的使用场景。

  • 加密算法编码算法的不同:编码算法并不是加密算法,它的目的仅仅是为了数据的传输与处理,无法保护数据的安全性。

希望通过本篇教程,大家能够对常见的编码算法有更清晰的了解,并掌握如何在Java中实现这些编码与解码操作。

标签:编码,01,UTF,字符,URL,Base64,Day14,ASCII
From: https://blog.csdn.net/max202011161630/article/details/144835641

相关文章

  • 2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n
    2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组nums1和nums2,分别长度为n和m,以及一个正整数k。如果nums1数组中的元素nums1[i]能被nums2数组中的元素nums2[j]乘以k除尽,则称(i,j)为一个优质数对(其中0<=i<=n-1,0<=j<=m-1)。请计算并返回所......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现14
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现9
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现11
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现2
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现8
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现1
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现12
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现13
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......
  • Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现1
    前言2009年9月Spring3.0RC1发布后,Spring就引入了SpEL(SpringExpressionLanguage)。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2框架,会发现绝大部分的安全漏洞都和ognl脱不了干系。尤其是远程命令执行漏洞,占据了多少甲方乙方......