[BT]小迪安全2023学习笔记(第4天:加密解密)

第4天

常用解密网站https://www.cmd5.com/
CTF比赛编码网站http://www.hiencode.com/

哈希函数

哈希函数是一种将任意长度的输入数据(通常称为“消息”)转换成固定长度输出字符串的计算过程。

特征如下:
确定性: 对于同一个输入,哈希函数总是产生相同的输出。
快速计算: 计算哈希值的过程是快速的,对于任何给定的输入,都能在短时间内产生哈希值。
不可逆性: 从哈希值不可能反向推导出原始输入数据(理想情况下)。
固定长度输出: 无论输入数据的大小如何,哈希函数的输出长度总是固定的。
高度敏感: 输入数据的微小变化(即使只是一个字节)都会导致输出哈希值的显著不同,这被称为“雪崩效应”。
碰撞阻力: 找到两个不同的输入数据,使它们产生相同的哈希值(即“碰撞”)应该是非常困难的。
哈希函数的碰撞是指两个不同的输入(例如,两段不同的文本)被哈希函数处理后产生了相同的输出(即相同的哈希值)。
原因:由于哈希函数将任意长度的输入转换为固定长度的输出,理论上总是存在无限多的输入映射到有限的输出集,因此碰撞是不可避免的。

应用如下:
数据校验: 哈希函数被用来验证数据的完整性,例如在文件传输过程中检查文件是否被篡改。
密码存储: 出于安全考虑,密码通常以哈希值形式存储在数据库中。即使数据库被泄露,攻击者也难以从哈希值恢复原始密码。
快速数据查找: 哈希函数用于构建哈希表,实现快速的数据检索操作。
数字签名: 在数字签名和证书验证中,哈希函数用于确保消息的真实性和完整性。
防止重复数据: 在数据去重过程中,哈希函数用于识别重复的数据项。
MD5和SHA1由于其脆弱性在某些安全敏感的应用中不再推荐使用。相比之下,SHA-256等更先进的哈希函数提供了更高的安全性。

1.MD5:

格式特点:产生128位(16字节)的哈希值,通常表示为32个字符的十六进制数。
区分特征:因为速度快且简单,但安全性较低(易受碰撞攻击),多用于校验而不推荐用于密码存储。

假设原始数据为 “Hello World”,加密后的结果如下

5eb63bbbe01eeed093cb22bb8f5acdc3

一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串

“盐值”(Salt)是一种用于增强密码加密强度的方法。盐值是一个随机生成的数据片段,与用户的密码组合在一起,然后一起进行哈希处理。

盐值的作用
独一无二:为每个用户的密码添加一个唯一的盐值,即使两个用户的原始密码相同,由于盐值的不同,他们的哈希值也将不同。

SHA1:

格式特点:产生160位(20字节)的哈希值,通常表示为40个字符的十六进制数。
区分特征:比MD5更安全,但近年来也显示出安全性不足,不推荐用于敏感数据的安全保护。

假设原始数据为 “Hello World”,加密后的结果如下

2ef7bde608ce5404e97d5f042f95f89f1c232871

NTLM:

格式特点:是微软Windows网络环境中使用的一种安全协议,用于身份验证。
区分特征:特定于Windows系统,存在多个版本(NTLM、NTLMv2等),已被认为不够安全,容易受到暴力破解和其他类型的攻击。

假设原始数据为 “Hello World”,加密后的结果如下

b7e4b9a3439accd819aadae2d7cd0dee

加密算法

加密算法主要分为两类:对称加密算法和非对称加密算法。

对称加密算法
定义:在对称加密算法中,加密和解密过程使用相同的密钥。因此,密钥的安全传输和管理至关重要。
特点:

  • 速度快:相比于非对称加密,对称加密通常更快,适用于大量数据的加密。
  • 应用广泛:常用于文件加密、数据库加密、安全通信等。

示例:AES(高级加密标准)、DES(数据加密标准)、3DES、RC4等。

非对称加密算法
定义:在非对称加密中,使用一对密钥:公钥和私钥。公钥用于加密信息,私钥用于解密。公钥可以公开分享,而私钥必须保密。
特点:

  • 提供身份验证:可以确认信息发送者的身份,防止身份伪造。
  • 密钥分发简单:由于公钥可以公开分享,因此解决了密钥分发的难题。
  • 速度较慢:相比对称加密,非对称加密在处理速度上较慢,不适合加密大量数据。

示例:RSA、ECC(椭圆曲线加密)、Diffie-Hellman密钥交换算法等。

以下列举的AES、DES和RC4都是对称加密算法。

AES(高级加密标准):

格式特点:块加密算法,有多种密钥长度(如AES-128, AES-192, AES-256)。每个块的大小为128位。
区分特征:目前被认为是最安全的对称加密算法之一,广泛用于政府和金融机构。

假设原始数据为 “Hello World”,加密后的结果如下

16进制: 8d969eef6ecad3c29a3a629280e686cf
Base64: jZae727K08KaOmKSgOaGzQ==

长度取决于加密模式和填充方式,这里假设使用AES-128 ECB模式,无填充

DES(数据加密标准):

格式特点:早期的块加密算法,密钥长度为56位,块的大小为64位。
区分特征:由于密钥较短,已被认为不够安全,易受暴力破解攻击,已被更安全的AES所替代。

假设原始数据为 “Hello World”,加密后的结果如下

16进制: 7a15f5bbeae0019b
Base64: ehX1u+6gAZs=

8字节块,输出长度取决于填充方式,这里假设使用DES ECB模式,无填充

RC4:

格式特点:流加密算法,密钥长度可变,通常介于40到2048位。
区分特征:以其简单性和速度著称,但由于安全漏洞已不再被推荐用于安全敏感的应用。

假设原始数据为 “Hello World”,加密后的结果如下

16进制: e2be8f95d8e8c7a0
Base64: 4r6PlNjox6A=

长度与原始数据相同,但内容完全不同

编码方式

Base64 编码

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。它常用于在那些只能处理文本数据的场合中传输二进制数据。具体来说,它是一种二进制到文本的编码方法,用于在网络上传输数据。

原理: Base64 将每三个字节的二进制数据转换成四个字节的文本字符。它使用 64 个字符(大写字母 A-Z,小写字母 a-z,数字 0-9,加上 “+” 和 “/”)进行编码,以及一个额外的 “=” 用于填充。

特点:

  • 编码后的数据比原始数据大约增加 33%。
  • 字符集:使用64个字符(A-Z, a-z, 0-9, +, /)和一个额外的等号(=)用于填充。
  • 输出长度:编码后的长度约为原始数据的4/3。
  • 可打印字符:生成的是可打印字符,适合在文本系统(如XML、JSON)中传输。
  • 无损编码:编码和解码过程不会丢失信息,保证数据的完整性。
  • 非压缩型:不是一种数据压缩方法,实际上会增加数据大小。

假设原始数据为 “Hello World”,编码后的结果如下

SGVsbG8gV29ybGQ=

Base64编码结果以=结尾用于填充,以保证输出长度是4的倍数。

URL 编码(百分号编码)

URL 编码,也称为百分号编码,用于在 URI(统一资源标识符)中安全地传输标准字符集之外的字符。

原理: 在 URL 编码中,非 ASCII 字符(如中文字符)、保留字符(如 ?, /, :, @ 等)和一些特殊符号(如空格)被转换成百分号(%)后跟两个十六进制数的形式。用于确保网络中的 URL 被正确解读,防止 URL 中的特殊字符被错误处理。

特点: URL 编码通常只用于地址的一部分,而不是整个地址。通常只用于URL的特定部分,如查询字符串参数。

假设原始数据为 “Hello World”,编码后的结果如下

Hello%20World

HEX(十六进制)编码

十六进制编码是一种将二进制数据表示为十六进制值的方法。在 HEX 编码中,每个字节的数据(8 位)被表示为两个十六进制数字。

原理: 十六进制系统使用 16 个符号(0-9 和 A-F)来表示数值。在编码中,每两个十六进制字符表示一个字节的数据。因为它们可以更直观地表示和理解二进制数据。

特点: 十六进制编码使得二进制数据的每个字节更加紧凑(只需要两个字符),同时仍保持可读性。使用0-9和A-F(或a-f)的字符集。

假设原始数据为 “Hello World”,编码后的结果如下

48656c6c6f20576f726c64

前端代码加密

JS颜文字 (JS Emoticons)

概念: JS颜文字是一种在JavaScript代码中使用Unicode字符创建颜文字(表情符号)的方式。这些颜文字纯粹是为了娱乐和审美目的,可以用于给代码添加趣味性和个性化元素。

应用: 可以用来加密一些数据,使其看起来像表情文字。

JSFuck

概念: JSFuck是一种JavaScript的编码风格,它只使用6个字符:[ ] ( ) ! + 来编写代码,能够只用这几个基本字符来表示几乎所有的JavaScript代码,例如,一个简单的alert语句可以用JSFuck风格编写为一长串只包含[ ] ( ) ! +的代码。
应用: JSFuck主要用于技术展示、编程挑战或混淆代码。虽然从技术上讲,用JSFuck编写的代码是有效的,但由于其可读性极差,实际应用非常有限。

后端代码加密

PHP

Zend Guard:

一个流行的PHP代码加密工具,用于加密和混淆PHP源代码。Zend Guard提供代码加密和版权保护功能,防止源代码被轻易查看或修改。

ionCube:

另一种广泛使用的PHP加密工具,它将PHP代码编译成字节码形式,然后加密这些字节码。为了运行这些加密的代码,服务器必须安装ionCube Loader。

.NET

混淆器(Obfuscators):.

NET平台上常用的代码保护方法是使用混淆器。混淆器通过重命名变量和方法、改变代码结构等方式使代码难以被理解。

.NET Reactor 和 ConfuserEx

是.NET平台上常见的混淆工具。

安全类库(Secure Class Libraries):

将关键代码编译为安全类库,以减少源代码的暴露。

Java

ProGuard:

是Java和Android应用程序中广泛使用的一个开源工具,它可以缩小、优化、混淆和预验证Java字节码。

Jar加密:

一些工具提供了Java归档文件(.jar)的加密,尽管这并不是一种标准做法。

JGuard:

这是另一种Java混淆工具,用于保护Java应用程序免受反编译。
通用技术

代码签名:

通过对代码进行数字签名,可以保证代码的完整性和来源验证,这在所有三个平台上都是一种常见做法。
加密或混淆代码可能会对应用程序的性能产生一定影响。

[BT]小迪安全2023学习笔记(第4天:加密解密)_第1张图片

你可能感兴趣的:(小迪安全学习笔记,安全,学习,笔记)