编码、加密、Hash、序列化和字符集

发布时间:2026/9/1 1:18:17
编码、加密、Hash、序列化和字符集 编码、加密、哈希的区别编码Encoding和加密Encryption都涉及将原始数据明文转换为另一种形式但其核心目标、可逆性、安全性等存在本质差异。‌核心区别‌‌目的不同‌‌编码‌为适应传输、存储或系统兼容性需求将数据转换为另一种格式。‌加密‌为保护数据机密性防止未授权访问通过密钥将明文转换为密文。‌可逆性‌两者通常都‌可逆‌但加密必须使用‌正确密钥‌才能解密。编码通过‌公开规则‌即可解码。‌安全性‌‌编码不提供安全性‌任何人都能解码。‌加密的核心是安全性‌依赖密钥保密性。Base64 ‌不是加密算法‌它只是编码方式。MD5是哈希采样它不是编码也不是加密。‌哈希Hashing的区别‌哈希常与编码、加密混淆简要说明‌哈希如 SHA-256、MD5‌‌不可逆‌用于生成数据“指纹”即数据摘要用于验证完整性如文件校验、密码存储。不用于恢复原始数据仅用于比对是否一致 。‌总结建议‌若需‌安全传输敏感数据‌如密码、密钥‌必须使用加密算法‌如 AES、RSA‌不要依赖 Base64 或其他编码‌ 。编码用于‌格式兼容‌加密用于‌机密保护‌两者可结合使用如先 AES 加密再 Base64 编码以便文本传输‌。对称加密通信双⽅使⽤同⼀个密钥使⽤加密算法配合上密钥来加密解密时使⽤加密过程的完全逆过程配合密钥来进⾏解密。经典算法DES56位密钥密钥太短⽽逐渐被弃⽤、AES128位、192位、256位密钥现在最流⾏对称加密的缺点是密钥泄露不能在不安全⽹络上传输密钥⼀旦密钥泄露则加密通信失败。加密功能并不负责密钥的安全传输和保管。⾮对称加密原理使⽤公钥对数据进⾏加密得到密⽂使⽤私钥对数据进⾏解密得到原数据。使⽤⾮对称加密通信可以在不可信⽹络上将双⽅的公钥传给对⽅然后在发消息前分别对消息使⽤对⽅的公钥来加密和使⽤⾃⼰的私钥来签名做到不可信⽹络上的可靠密钥传播及加密通信。由于私钥和公钥互相可解因此⾮对称加密还可以应⽤于数字签名技术。通常会对原数据hash以后对hash签名然后附加在原数据的后⾯作为签名。经典算法RSA可⽤于加密和签名、DSA仅⽤于签名但速度更快⾮对称加密的优缺点优点可以在不安全⽹络上传输密钥缺点计算复杂因此性能相⽐对称加密差很多Base64是将⼆进制数据转换成由64个字符组成的字符串的编码算法。算法将原数据每6位对应成Base 64索引表中的⼀个字符编排成⼀个字符串每个字符8位。Base64的⽤途将⼆进制数据扩充储存和传输途径例如可以把数据保存到⽂本⽂件、可以通过聊天对话框或短信形式发送⼆进制数据、可以在URL中加⼊简单的⼆进制数据⼀定条件下的防偷窥。普通的字符串在经过Base64编码后的结果会变得⾁眼不可读。Base64的缺点因为⾃身的原理6位变8位因此每次Base64编码之后数据都会增⼤约1/3所以会影响存储和传输性能。用Base64编码图⽚Base64会导致数据增⼤1/3降低⽹络性能Base64对图⽚进⾏编码的⽤处只在于有时需要使⽤⽂本形式来传输图⽚。变种Base58⽐特币使⽤的编码⽅式去掉了Base64中的数字0字⺟⼤写O字⺟⼤写I和字⺟⼩写l以及和/符号⽤于⽐特币地址的表示。Base58对于Base64的改动主要⽬的在于⽤户的便捷性。由于去掉了难以区分的字符使得Base58对于「⼈⼯抄写」更加⽅便。另外去掉了 /号后也让⼤多数的软件可以⽅便双击选取。URL中使⽤的百分号编码在URL的字符串中对⼀些不⽤于特殊⽤途而用作内容的保留字符使⽤百分号%为前缀进⾏单独编码以避免出现解析错误。例如符号就会被解析为分隔符号因此需要对它进⾏转码。这种编码仅⽤于URL⽬的是避免解析错误的出现。压缩是编码吗是。所谓编码即把数据从⼀种形式转换为另⼀种形式。压缩过程属于编码过程解压缩过程属于解码过程。序列化把数据对象⼀般是内存中的例如JVM中的对象转换成字节序列的过程。对象在程序内存⾥的存放形式是散乱的存放在不同的内存区域、并且由引⽤进⾏连接通过序列化可以把内存中的对象转换成⼀个字节序列从⽽使⽤byte[]等形式进⾏本地存储或⽹络传输在需要的时候重新组装反序列化来使⽤。⽬的让内存中的对象可以被储存和传输。序列化是编码吗不是和编码的区别编码是把数据由⼀种数据格式转换成另⼀种数据格式⽽序列化是把数据由内存中的对象⽽不是某种具体的格式转换成字节序列。Serializable是Java提供的序列化机制Parcelable是Android提供的适合于内存中进行传输的序列 化方式。Hash把任意数据转换成指定⼤⼩范围通常很⼩例如256字节以内的数据。作⽤相当于从数据中提出摘要信息因此最主要⽤途是数字指纹。Hash的实际⽤途唯⼀性验证。例如Java中的hashCode()⽅法。怎么重写hashCode⽅法把equals()⽅法中的每个⽤于判断相等的变量都放进hashCode()中⼀起⽣成⼀个尽量不会碰撞的整数即可。完整性验证。从⽹络上下载⽂件后通过⽐对⽂件的Hash值例如MD5、SHA1是否一致可以确认下载的⽂件是否有损坏。快速查找。HashMap隐私保护。当重要数据必须暴露的时候有时可以选择暴露它的Hash值例如MD5以保障原数据的安全。例如⽹站登录时可以只保存⽤户密码的Hash值在每次登录验证时只需要将输⼊的密码的Hash值和数据库中保存的Hash值作⽐对就好⽹站⽆需知道⽤户的密码。这样当⽹站数据失窃时⽤户不会因为⾃⼰的密码被盗导致其他⽹站的安全也受到威胁。注意这不属于加密。Hash是编码或加密吗都不是。Hash是单向过程往往是不可逆的⽆法进⾏逆向恢复操作。字符集分⽀ASCII128个字符1字节ISO-8859-1对ASCII进⾏扩充1字节Unicode13万个字符多字节UTF-8Unicode的编码分⽀UTF-16Unicode的编码分⽀GBK / GB2312 / GB18030中国⾃研标准多字节字符集编码HTTPSHTTP over SSL的简称即⼯作在SSL或TLS上的HTTP。⼯作原理是在客户端和服务器之间协商出⼀套对称密钥每次发送信息之前将内容加密收到之后解密达到内容的加密传输。为什么不直接⽤⾮对称加密⾮对称加密由于使⽤了复杂了数学原理因此计算相当复杂如果完全使⽤⾮对称加密来加密通信内容会严重影响⽹络通信的性能。数字证书数字证书中包含公钥SerializableSerializable需要使用IO对序列化数据直接写入到文件当中。而Parcelable是 android特有的序列化方式在开发中可能并不需要将数据保存到文件当中只在内存中进行传输使用此时使 用Parcelable将更为高效因为Parcelable依赖于ParcelParcel的意思是包装实现原理是在内存中建立一块共享 数据块序列化和反序列化均是操作这一块的数据而不像Serializable需要使用IO。Serializable是java序列化的方式存取的过程有频繁的IO性能较差但是实现简单。Parcelable是android序列化的方式采用共享内存的方式实现用户空间和内核空间的交换性能很好但是 实现方式比较复杂。Serializable可以持久化存储Parcelable是存储在内存中的不能持久化存储。