加密,混淆,摘要,序列化的理解

**

1.加密

**

加密是将可读的数据(明文)转换为不可读的格式(密文)的过程。只有持有特定密钥的人才能将密文解密为明文。

**

2.摘要

**

摘要是一种单向加密,用于确保数据的完整性,通常使用哈希函数,如SHA-256,MD5。

摘要和加密都是处理数据的技术,但它们的目的和实现方式有明显的不同。下面是它们之间的主要区别:

目的

摘要(Hashing):
主要用于确保数据的完整性。
通过生成固定长度的哈希值来代表任意长度的数据,便于快速比较和验证数据是否一致。

加密(Encryption):
主要用于保护数据的机密性。
通过将数据转换为不可读的形式,仅允许授权用户通过解密恢复原始数据。

过程

摘要:
输入数据通过哈希算法处理后生成哈希值(摘要)。
哈希值是固定长度的,不可逆,即不能从哈希值中恢复出原始数据。

加密:
输入数据使用加密算法和密钥进行转换,生成密文。
密文可以通过对应的解密算法和密钥恢复为原始数据。

可逆性

摘要:
不可逆:无法从哈希值推导出原始数据。例如,SHA-256的输出是一个256位的散列值,不能反向计算得到原始输入。

加密:
可逆:使用密钥可以将密文解密回原始数据。只有持有正确密钥的用户才能访问原始信息。

输出长度

摘要:
输出长度是固定的,无论输入数据的大小如何(例如,SHA-256始终产生256位的哈希值)。

加密:
输出长度通常与输入数据大小相关,密文的长度可能与原始数据长度不同,具体取决于加密算法和填充方式。

**

3.混淆

**

混淆是对程序代码进行变形和重命名的过程,目的是使代码更难以阅读和理解,防止他人逆向工程或盗取代码。

假设你有以下简单的Java类:

java
public class Example {
    public void display() {
        System.out.println("Hello, World!");
    }
}

混淆后,它可能会变成这样:

public class a {
    public void b() {
        System.out.println("Hello, World!");
    }
}

编写代码

在开发过程中,程序员编写的代码是可读的,例如变量名、类名、方法名等都使用描述性名称。

编译

代码编译成字节码或机器码,这是软件打包的第一步。对于Java程序,编译后会生成.class文件。

混淆

在打包之前或之后,使用混淆工具对编译后的字节码进行混淆。这些工具会改变代码的结构和名称,使其更难以阅读和理解。混淆后的代码仍然可以正常运行,但代码的可读性大大降低。例如,变量名可能会被更改为短小的随机字符串。

打包

将混淆后的代码和资源打包成最终的可执行文件或库(例如JAR文件、APK文件等)。

分发

将打包好的软件分发给用户。在用户使用软件时,混淆的代码使得逆向工程变得更加困难,从而保护了软件的核心逻辑和算法。

**

4.序列化

**

序列化是一种将对象的状态转换为可以存储或传输的格式的过程。它通常用于将复杂数据结构或对象转换为字节流,以便在网络传输、持久化存储(如文件或数据库)或其他需要将对象保存到不同环境中的场景中使用。下面是关于序列化的详细说明:

1. 基本概念
序列化:将对象转换为字节流或其他可存储格式(如JSON、XML等)的过程,以便于保存或传输。
反序列化:将序列化的数据转换回原始对象的过程。
2. 用途
数据持久化:将对象的状态保存到文件或数据库中,以便于在需要时恢复。
网络传输:在不同系统之间传输对象,例如通过网络发送数据。
跨平台通信:在不同编程语言或平台之间交换数据,例如使用JSON或XML格式。
3. 常见序列化格式
二进制序列化:直接将对象的内存表示转换为字节流,通常速度较快,适用于内部存储和传输。
文本序列化:使用可读文本格式,如JSON、XML等,易于人类阅读和编辑,适用于需要与其他系统或语言交互的场景。

### Apache Shiro 反序列化漏洞及 Cookie 加密机制 #### 一、反序列化漏洞原理 Apache Shiro框架中的记住密码功能(RememberMe)存在安全风险。当用户登录成功后,系统会生成一段由相关信息组成的cookie值。这段数据经历了序列化、AES加密以及Base64编码的过程[^2]。 在服务器接收到带有`RememberMe`键名的HTTP请求时,会对其中携带的数据执行一系列逆向操作:首先是Base64解码;接着利用固定的AES秘钥完成解密工作;最后一步则是Java对象流式的反序列化过程。然而,在此过程中并未对接收的内容实施有效的验证措施,这就使得攻击者能够精心构造恶意输入,从而触发远程命令执行(RCE)漏洞[^3]。 #### 二、Cookie 加密流程分析 对于通过RememberMe特性保存下来的认证状态而言: - **客户端存储形式**:以名为`RememberMe`的cookie形式存在于用户的浏览器环境中; - **内容结构**:其实际载荷包含了被序列化的用户身份信息片段,并且这些敏感资料已经过两层保护——先是采用了对称加密算法(AES),随后又进行了字符集转换(Base64)[^1]。 具体来说就是先将待传输的信息转化为字节数组并加以混淆处理,再将其映射到ASCII范围内便于网络传递的一串字符串上。这样的设计既保障了信息安全又能兼容大多数协议栈下的通信需求。 ```python import base64 from Crypto.Cipher import AES def encrypt_data(data, key): cipher = AES.new(key.encode(), AES.MODE_ECB) encrypted_bytes = cipher.encrypt(pad(data)) encoded_str = base64.b64encode(encrypted_bytes).decode('utf-8') return encoded_str def decrypt_and_deserialize(cookie_value, key): decoded_bytes = base64.b64decode(cookie_value) cipher = AES.new(key.encode(), AES.MODE_ECB) decrypted_bytes = unpad(cipher.decrypt(decoded_bytes)) # 假设这里有一个函数可以实现java对象的反序列化 deserialized_object = java_deserialization(decrypted_bytes) return deserialized_object ``` 需要注意的是上述代码仅为示意用途,真实场景下还需要考虑更多细节如填充模式的选择等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值