一、密码存储加密知识点
1、MD5
MD5加密是一种广泛使用的密码杂凑函数,它可以将任意长度的信息通过一系列复杂的数学和位操作转化为一个128位(16字节)的散列值(hash value),这个散列值通常被表示为一个32位的十六进制数。MD5加密在信息安全领域有着重要的应用,但需要注意的是,随着计算技术的发展,MD5加密的安全性已经受到挑战,不再适用于需要高安全性的场合。如果仍然需要使用MD5,可以考虑采取一些额外的安全措施来提高其安全性。以下是一些常用的额外安全措施:
(1)加盐
加盐是在原始数据(如密码)上附加一个随机字符串(盐值),然后再进行MD5散列。由于每个用户或每次散列操作都使用不同的盐值,因此即使两个原始数据相同,它们的散列值也会因为盐值的不同而不同。这样,即使攻击者知道了某个散列值,也无法直接通过查找预计算的散列值表(彩虹表)来找到原始数据,因为表中不包含带有特定盐值的散列值。
(2)密钥扩展
密钥扩展是一种通过增加计算复杂度来提高密码破解难度的技术。它使用一种算法来反复处理密码和盐值,从而生成一个更长的密钥。这个密钥再被用作散列函数的输入。由于增加了额外的计算步骤,攻击者通过暴力破解找到原始数据的难度大大增加
2、SHA1
SHA-1(安全散列算法1,Secure Hash Algorithm 1)是一种广泛使用的密码散列函数,它接收一段长度不超过2^64比特(bit)的输入(又称作“消息”),并产生一个被称为“消息摘要”的160比特(bit)散列值(或称哈希值、哈希码、摘要),散列值是一个固定长度的字符串,通常用一个40位的十六进制数表示。SHA-1因其设计上的特性,被广泛用于数字签名、文件完整性验证等领域,以确保信息的真实性和完整性。然而,近年来随着计算能力的提升,SHA-1的安全性受到了挑战,已有研究表明SHA-1不再适合用于安全性要求较高的场合,比如数字证书签名,因为它存在被碰撞攻击的风险。尽管如此,SHA-1在不需要极高安全性的场合仍然被广泛使用。
3、NTLM
NTLM(NT LAN Manager)是一种身份验证协议,主要用于Windows网络环境中的用户身份验证。它最初是为Windows NT 3.1设计的,并随着Windows操作系统的发展而不断演进。NTLM加密主要涉及用户密码的加密处理,以确保在网络传输过程中密码的安全性。
在NTLM认证过程中,用户的密码首先会被转换成一种称为NTLM哈希的格式。这个哈希值是通过将用户的密码(通常是明文)与用户名(以大写形式)组合,然后使用MD4哈希算法进行加密得到的。然而,需要注意的是,NTLM哈希本身并不直接在网络上传输,而是用于后续的认证步骤中。
在NTLMv2(NTLM的第二个版本)中,为了提高安全性,引入了挑战/响应机制。服务器会生成一个随机的挑战值,并将其发送给客户端。客户端然后使用用户的密码哈希、用户名、挑战值以及可能的其他信息(如域信息)来生成一个响应值,并将这个响应值发送回服务器进行验证。这种机制增加了攻击者通过截获网络流量来破解密码的难度。
4、AES、DES、RC4
AES(高级加密标准,Advanced Encryption Standard)、DES(数据加密标准,Data Encryption Standard)和RC4(Rivest Cipher 4)都是广泛使用的对称加密算法,它们通过加密密钥对明文进行加密,使得只有持有相同密钥的授权用户才能解密和读取数据。
(1)AES:作为新一代的加密标准,AES以其高效、安全、灵活的特点,在数据加密领域占据了主导地位。AES提供了三种不同的密钥长度(128位、192位和256位),允许用户根据安全需求选择适合的加密强度。由于其出色的性能和安全性,AES已成为保护敏感信息(如金融交易、个人隐私等)的首选加密算法。
(2)DES:作为较早的加密标准,DES在过去几十年中得到了广泛应用。然而,随着计算能力的提升,DES的56位密钥长度已不足以提供足够的安全性,容易受到暴力破解和其他攻击手段的威胁。因此,尽管DES在某些旧系统或兼容性要求下仍被使用,但已不再推荐用于新的安全应用中。
(3)RC4:RC4是一种流密码算法,以其简单易实现和高速的特点而受到青睐。然而,近年来对RC4安全性的研究表明,它存在若干弱点,包括偏置问题和可预测性问题,这使得RC4不再适合用于需要高安全性的场合。尽管如此,由于其在一些旧系统和协议中的广泛应用,RC4仍然需要得到适当的关注和处理。
二、传输数据加密知识点
1、BASE64
BASE64是一种基于64个可打印字符来表示二进制数据的表示方法。它主要用于在需要处理文本数据的场合(如电子邮件的传输、网页的编码等),将二进制数据(如图片、音频、视频等文件的二进制内容)转换成ASCII字符串形式,以便于存储和传输。BASE64编码通过将每三个字节的二进制数据(共24位)划分为四组,每组6位,然后在这6位二进制数的前面补两个0(因为64是2的6次方,所以每组6位二进制数可以表示64种不同的状态,对应64个可打印字符),形成8位二进制数(即一个字节),最后根据这个字节的值在BASE64编码表中找到对应的字符。由于二进制数据长度不一定是3的倍数,因此BASE64编码后的字符串长度会是4的倍数,并在必要时以等号“=”作为填充字符。BASE64编码不仅限于处理二进制数据,也可以用于任何数据的编码,但其主要用途还是在于二进制数据的文本表示。
2、URL编码
URL编码(也称为百分号编码)是一种将字符转换为可以在统一资源定位符(URL)中安全传输的格式的方法。由于URL的某些部分(如路径和查询字符串)只能包含ASCII字符集中的特定字符,而许多字符(如空格、特殊字符等)在URL中具有特殊含义或不被允许,因此需要对这些字符进行编码。
在URL编码中,每个需要编码的字符都会被替换为%
后跟该字符的ASCII码(十六进制形式)的两个字符。例如,空格字符(ASCII码为32)在URL编码中会被替换为%20
。这样,即使URL中包含非ASCII字符或特殊字符,也能确保其在网络上安全、准确地传输。
URL编码不仅限于处理特殊字符,它还可以用于任何需要在URL中传输的字符,以确保数据的完整性和一致性。在Web开发中,URL编码是处理表单数据、查询字符串等常见任务时不可或缺的一部分。
3、HEX编码
HEX编码(十六进制编码)是一种将二进制数据转换为十六进制数表示的方法。在计算机科学中,二进制数据是计算机内部存储和处理信息的基本形式,但直接阅读或传输二进制数据往往不够直观和方便。因此,HEX编码通过将每4位二进制数转换为一个十六进制数(十六进制是基数为16的数制,使用0-9和A-F共16个符号表示),从而将二进制数据转换为一串由0-9和A-F组成的字符串。
HEX编码的好处在于它提供了一种紧凑且易于人类阅读和理解的格式来表示二进制数据。此外,由于十六进制数可以很容易地转换为二进制数(每个十六进制数对应4位二进制数),HEX编码也便于在计算机之间进行二进制数据的传输和处理。因此,HEX编码在编程、网络通信、数据存储等领域得到了广泛应用。
4、ASCII编码
ASCII编码(美国信息交换标准代码,American Standard Code for Information Interchange)是一种基于拉丁字母的计算机字符编码标准。它最初由美国国家标准学会(ANSI)制定,用于将英文字母、数字、标点符号等字符转换为计算机可以直接处理的数字形式。ASCII编码使用7位(或8位,最高位通常用作奇偶校验位)二进制数来表示128(或256)个不同的字符,包括大小写英文字母、数字0-9、标点符号、控制字符等。
ASCII编码的出现极大地促进了计算机之间的信息交换和通信,因为它为不同的计算机系统和设备提供了一种统一的字符表示方法。尽管随着计算机技术的发展,出现了许多其他字符编码标准(如Unicode),但ASCII编码仍然在许多领域(如网络通信、文本文件处理等)中发挥着重要作用。
三、JavaScript前端代码加密
1、JS颜文字
JavaScript(JS)对颜文字(Emoji)的支持是通过Unicode标准实现的。Unicode是一个旨在将世界上所有的书写系统、符号以及表情符号编码为唯一字符编码的国际标准。在JavaScript中,颜文字被当作Unicode字符序列的一部分,可以直接嵌入到字符串字面量中,而无需进行任何特殊的转义或编码转换。
2、Jother
jother编码是在JavaScript语言中,一种创新的编码方式,它巧妙地利用少量特定字符(如括号、加号、逗号等)来构造精简的匿名函数,这些匿名函数通过复杂的逻辑组合,间接地表示或生成字符串。这种方式不仅极大地压缩了代码体积,还增加了代码的阅读难度,使得未经授权的查看者难以直接理解代码的真实意图。jother编码可能适用于需要高度混淆代码以保护知识产权或绕过某些安全检测的场景,如Web应用中的代码保护、数据隐藏等。
3、JSFUCK
JSFuck是一种由日本的Yosuke HASEGAWA在2010年创造的JavaScript编码技术,它仅仅使用六种符号——即括号“()”、加号“+”、方括号“[]”、感叹号“!”、点号“.”(在某些版本中可能不包括点号)来编写JavaScript代码。这种编码方式通过巧妙地利用JavaScript的特性和操作符,将常见的JavaScript代码和逻辑转换成由这六种字符组成的复杂序列。JSFuck编码后的代码虽然难以阅读和理解,但它在代码混淆、隐藏真实逻辑以及绕过某些安全检查(如跨站脚本XSS防护)方面具有一定的应用价值。
四、后端代码加密
1、PHP
代码混淆是一种技术,通过改变代码的结构而不改变其功能,使得代码难以被人类阅读和理解。这包括变量名、函数名、字符串等的重命名和重排,以及添加无用的代码(即“垃圾代码”)等。PHP社区中有一些工具和库可以帮助进行代码混淆,但请注意,混淆并不能完全防止代码被逆向工程。
2、.NET
.NET代码会封装成DLL文件,DLL文件包含了可由多个程序同时使用的代码和数据。然而,直接“封装”源代码文件(如C#、VB.NET等)为DLL并不涉及对源代码的“加密”或使其变成乱码,而是通过编译过程将源代码转换成可执行的机器代码(或中间语言代码,对于.NET而言是MSIL),然后打包成DLL文件。
3、JAVA
将Java类文件打包成JAR(Java ARchive)文件是一种常见的做法。JAR文件可以包含Java类文件、相关元数据和资源(如图像和配置文件),并且可以被Java虚拟机(JVM)直接加载和执行。虽然JAR文件本身并不提供加密功能,但你可以通过其他方式(如HTTPS)来安全地传输JAR文件。
五、数据库密文加密
1、MYSQL
MySQL 提供了一些内置的加密函数,如 AES_ENCRYPT()
和 AES_DECRYPT()
,这些函数允许你使用 AES 加密算法对数据进行加密和解密。你可以在 INSERT 语句中使用这些函数来加密数据,并在 SELECT 语句中使用相应的解密函数来获取原始数据。
2、MSSQL
MSSQL提供了一系列内置的加密函数,如ENCRYPTBYPASSPHRASE
、ENCRYPTBYCERT
、DECRYPTBYPASSPHRASE
和DECRYPTBYCERT
等,这些函数允许在数据库中对数据进行加密和解密。
六、数据显示编码
1、UTF-8
UTF-8(Unicode Transformation Format-8 bits)是一种针对Unicode的可变长度字符编码,能够用1到4个字节表示每个符号,从而有效地使用字节来表示世界上几乎所有的系统和语言的字符。UTF-8是互联网上最广泛使用的字符编码之一,它向后兼容ASCII,并允许对文本进行高效传输和存储。
2、GBK-2312
GBK-2312,实际上更常见的表述是GBK,它是GB 2312字符编码的扩展。GB 2312,全称为《信息交换用汉字编码字符集·基本集》,是中国国家标准简体中文字符集,于1981年5月1日实施。GB 2312标准共收录6763个汉字,包括一级汉字3755个和二级汉字3008个,同时还收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。GBK采用双字节编码,其中第一字节的范围是81–FE(不包括80和FF),第二字节的一部分在40–7E,另一部分在80–FE。这种扩展使得GBK能够表示更多的字符,从而满足更广泛的应用需求。
七、识别算法编码类型
1、观察密文位数
首先观察密文的位数,不同的编码类型通常具有不同的长度或位数特征。
2、字符类型
分析密文中包含的字符类型,如数字、字母(大写或小写)、符号等。某些编码类型可能特定地包含某些字符集。
3、应用场景
了解密文所在的上下文或应用场景,如Web、数据库、操作系统等。不同的应用场景可能倾向于使用不同的编码类型。
八、案例演示
1、某CMS账号密码MD5加密
安装完网站之后,使用数据库连接工具连接web网站对应的数据库,找到存储账号密码的表,查询数据发现密码被加密。
根据加密的位数(32)以及加密的特征判断优先为MD5加密,将密码复制到MD5解密网站,经解密得出就是管理员的账号密码,证实了密码在数据库中的加密方式为MD5。
2、某论坛网站MD5加密解析
安装完网站之后,使用数据库连接工具连接web网站对应的数据库,找到存储账号密码的表,查询数据发现密码被加密。根据加密的位数(32)以及加密的特征判断优先为MD5加密,将密码复制到MD5解密网站,但是这次发现查询不到解密结果,这说明有两种可能,一种是MD5加密方式有变化,一种不是MD5加密。
首先验证第一点:去网上寻找该论坛网站账号密码的加密方式,发现是MD5加盐的加密方式,并且这个salt的值在pre_ucenter_members表中的salt字段中存在(但不知为什么我的数据库中这一项是空的),随后就可以选择加盐的解密方式解密出密码了。
3、 windows系统NTLM加密&HASH加密
NTLM(New Technology LAN Manager)是微软用于Windows身份验证的主要协议之一,我们可以通过特定的工具获取windows系统保存的加密密码(windwos7之后不能获得明文密码),可以在下图中看到NTLM加密的值,我们也可以通过cmd5网站对NTLM的值进行解密。
4、CTF赛题-JS颜文字
首先登陆CTF网站:BUUCTF在线评测,然后在搜索框检索single dog,会出现2018年的一个题目,点开题目下载文件。
(1)发现提示是一张图片,如下图所示:
(2)查看图片属性,需要用到kali的binwalk功能模块
Binwalk是路由器固件分析的必备工具,该工具最大的优点就是可以自动完成指定文件的扫描,智能发掘潜藏在文件中所有可疑的文件类型及文件系统。而这个工具在kali中已经内置了。
(3)发现图片文件中还存在一个zip压缩文件,需要用到foremost分离这个压缩文件
Foremost是一款强大的Linux(及Windows可用)文件恢复工具,通过识别文件头和尾来高效恢复从硬盘、USB驱动器或任何可访问存储介质中丢失或删除的文件,支持多种文件类型。kali并没有内置,需要自己安装。
apt-get intsall -y foremost
foremost attachment.jpg
(4)将zip文件解压缩,发现1.txt文件,查看1.txt文件发现是JS颜文字,对JS颜文字进行解密,发现flag。解密网站推荐:CTF在线工具-CTF工具|CTF编码|CTF密码学|CTF加解密|程序员工具|在线编解码
(5)将SUCTF修改为flag就可以通关了
5、CTF赛题-JSFUCK
(1)首先登陆CTF网站:学逆向论坛|免费的CTF在线练习平台|ctf攻防训练靶场|网安夺旗竞赛系统|软件破解|病毒分析|游戏外挂|视频教程|xuenixiang.com - Powered by Discuz!
(2)注册账号并且创建战队(不创建无法答题),选择CTF,并且在题目名称筛选中输入JSFUCK
(3)选择第一道题目,点击JSfuck.zip进行下载
(4)下载后解压缩,发现提示是一个HTML页面,点击访问该页面
(5)右键点击查看网页源代码,发现提示代码,通过特征判断为JSFUCK
(6)复制这段到解密网站,如果是第四个案例中的解密网站,会发现不能解出flag,需要用到另一个解密JSFUCK的网站:JSFuck - Write any JavaScript with 6 Characters: []()!+,最终得出flag。