密码破解!字典攻击(C/C++代码实现)

news2024/12/27 3:39:21

字典攻击是一种通过系统地将字典中的每个单词作为密码输入,从而侵入受密码保护的计算机、网络或其他IT资源的方法。字典攻击也可以用于查找解密加密消息或文档所需的密钥。

字典攻击之所以有效,是因为许多计算机用户和企业坚持使用普通单词作为密码。这些攻击通常针对使用多字密码的系统不成功,也经常针对由大小写字母和随机组合的数字组成的密码不成功。

在密码要求很高的系统中,暴力攻击方法有时是有效的,在这种方法中,字符和空格的每一个可能组合都要测试到一定的最大长度。然而,暴力攻击可能需要很长时间才能产生结果。

强随机密码无法轻易预测,而且它们极不可能包含在预定的密码库中。由于字典攻击的猜测尝试仅限于预先选择的列表,因此基本上不可能破解不可预测的密码。

字典攻击是如何工作的?

字典攻击使用预先选择的单词和短语库来猜测可能的密码。它的操作假设用户倾向于从基本的密码列表中提取,如“password”、“123abc”和“123456”

这些列表不像其他暴力攻击那样广泛,但它们可能会变得相当大。手动处理和测试所有这些密码不是一种实用的方法。因此,通常需要额外的技术来加快该过程。攻击者使用支持程序,如密码字典或其他暴力攻击工具。

字典攻击的实施方式取决于攻击者登录的帐户、网络或设备是联机还是脱机。在在线攻击中,攻击者必须注意他们可以用来猜测正确密码的尝试次数。经过一定次数的尝试后,站点管理员、帐户经理、用户或入侵检测系统可能会检测到攻击,或者密码尝试限制可能会发挥作用。如果发生上述任何一种情况,系统都可以将攻击者锁定。

使用较短优先级的可能密码列表的字典攻击可能更成功。老练的黑客还可以禁用检测功能或密码尝试限制。

对于离线攻击,黑客可以尝试的密码数量几乎没有限制。但是,执行脱机攻击需要从系统访问密码存储文件。只有这样,才能在离线环境中发起字典攻击。

暴力攻击与字典攻击

暴力攻击和字典攻击的主要区别在于尝试的密码排列次数。

如何保护自己免受字典攻击

通过限制给定时间段内允许的尝试次数并明智地选择密码或密钥,可以将密码或解密密钥攻击的漏洞降至接近零。一种使系统免受字典攻击并实际上免受暴力攻击的方法需要以下三个条件:

1.只允许三次密码尝试;

2.在允许接下来的三次尝试之前需要经过15分钟的时间;

3.密码或密钥是一长串毫无意义的字母、数字和特殊符号。

垃圾邮件发送者经常使用字典攻击的形式。邮件会发送到由单词或名称组成的电子邮件地址,后跟@符号和特定域的名称。一长串给定的名字,如zhangsan、xiaowu、lilei或lisi再加上域名,通常都是成功的。

密码破解!字典攻击(C/C++代码实现)

应用程序将带有散列密码的文件作为第一个参数和可选的第二个参数字典文件。

...
/* 结构,包含线程的所有必要数据,在main中创建并作为参数传递给所有线程 */
struct thread_shared_data{
    char** dict_ptr;
    char** pass_ptr;
    char** br_pass_ptr;
    bool* is_cracked_ptr;
    unsigned long dict_size;
    unsigned long pass_size;
    unsigned long br_pass_size;
    unsigned int basic_thread_count;
    unsigned int two_word_thread_count;
};

/* 退出应用程序的函数,也是SIGINT的处理程序(CTRL+C)  */
void quit_program()
{
    printf("\nQuiting\n");
    running = false;
    show_stats = true;
    pthread_cond_broadcast(&pass_cracked_cv);
}

/* 使使用者线程打印统计信息的函数,也是SIGHUP的处理程序 */
void print_statistics()
{
    show_stats = true;
    pthread_mutex_lock(&cond_mutex);
    pthread_cond_broadcast(&pass_cracked_cv);
    pthread_mutex_unlock(&cond_mutex);
}

/* 函数,该函数使用MD5算法对给定字符串进行散列 */
void md5_hash(char * in_str, char ** out_str)
{
    if(*out_str != NULL) free(*out_str);
    *out_str = (char *)malloc(33*sizeof(char));

    unsigned char digest[16];
    MD5_CTX ctx;
    MD5_Init(&ctx);

    MD5_Update(&ctx, in_str, strlen(in_str));
    MD5_Final(digest, &ctx);

    for(int n = 0; n < 16; ++n)
        sprintf(&(*out_str)[n*2],"%02x", (unsigned int)digest[n]);
}
void *consumer_thread(void *arg);
void check_passwords(char * created_pass, struct thread_shared_data * my_tsd, unsigned int id);
void change_string_by_id(unsigned int id, char ** str);
void reset_thread(unsigned int id, unsigned long * num, bool * first_loop, unsigned long * i);
void *cracking_thread_basic(void *arg);
void *cracking_thread_two_words(void *arg);
void *cracking_thread_numbers(void *arg);
int read_file(char * file_name, char *** container_ptr, unsigned long * size);
...
int main(int argc, char * argv[])
{
...
    /* 检查是否给出了参数 */
    if(argc <= 1)
    {
        printf("main: passwords_file argument not given\n");
        printf(USAGE);
        exit(1);
    }

    /* 把字典读入存储器 */
    /* 检查参数中是否提供了字典 */
    if(argc >= 3)
    {
        if(read_file(argv[2], &tsd.dict_ptr, &tsd.dict_size) == -1)
        {
            printf("main: dictionary file: %s not found\n", argv[2]);
            exit(1);
        }
    }
    else /* 读取默认词典 */
    if(read_file(DEFAULT_DICTIONARY, &tsd.dict_ptr, &tsd.dict_size) == -1)
    {
        printf("main: default dictionary file: %s not found\n", DEFAULT_DICTIONARY);
        printf(USAGE);
        exit(1);
    }

    /* 将散列密码读入内存 */
    if(read_file(argv[1], &tsd.pass_ptr, &tsd.pass_size) == -1)
    {
        printf("main: passwords file: %s not found\n", argv[1]);
        exit(1);
    }
    else /* allocate是密码破解的数组,并将所有位初始化为零==false */
        tsd.is_cracked_ptr = (bool *)calloc(tsd.pass_size, sizeof(bool));

    /* 信号处理  */
    signal(SIGINT, quit_program);
    signal(SIGHUP, print_statistics);

    /* 创建线程并初始化互斥、cond值和读写锁 */
...
    for(int i = 2; i < NUM_THREADS; i+=2)
    {
        pthread_create(&threads[i], NULL, cracking_thread_basic, (void *) &tsd);
        pthread_create(&threads[i + 1], NULL, cracking_thread_two_words, (void *) &tsd);
    }
...
    while(running)
    {
        printf("main: waiting for input:\n");
        scanf("%s", input);
        if(!strcmp(input, "exit")) quit_program();
        else if(!strcmp(input, "stats")) print_statistics();
        else
        {
            if(read_file(input, &tmp_ptr, &tmp_size) == -1)
                printf("main: passwords file %s not found\n", input);
            else
            {
                /* reset */
                printf("main: new passwords file loaded\n");
                reset = true;
                pthread_rwlock_wrlock(&tsd_rwlock);
                printf("main: reset\n");
                print_statistics();
                for(unsigned long i = 0; i < tsd.pass_size; i++) free(tsd.pass_ptr[i]);
                free(tsd.pass_ptr);
                for(int i = 0; i < tsd.br_pass_size; i++) free(tsd.br_pass_ptr[i]);
                free(tsd.br_pass_ptr);
                tsd.br_pass_ptr = NULL;
                tsd.pass_ptr = tmp_ptr;
                tsd.pass_size = tmp_size;
                tmp_ptr = NULL;
                free(tsd.is_cracked_ptr);
                tsd.is_cracked_ptr = (bool *)calloc(tsd.pass_size, sizeof(bool));
                tsd.br_pass_size = 0;
                printf("main: start\n");
                reset = false;
                pthread_rwlock_unlock(&tsd_rwlock);
            }
        }
    }
    free(input);

    /* 清理程序 */
    pthread_mutex_destroy(&count_mutex);
    pthread_mutex_destroy(&cond_mutex);
    pthread_cond_destroy(&pass_cracked_cv);
    pthread_rwlock_destroy(&tsd_rwlock);

    printf("main: freeing memory\n");
    /* 免费字典数组 */
    for(unsigned long i = 0; i < tsd.dict_size; i++)
        free(tsd.dict_ptr[i]);

    free(tsd.dict_ptr);
    /* 免费密码数组 */
    if(tsd.pass_ptr != NULL)
    {
        for(unsigned long i = 0; i < tsd.pass_size; i++)
            free(tsd.pass_ptr[i]);

        free(tsd.pass_ptr);
    }
    /* 免费破解密码数组 */
    if(tsd.br_pass_ptr != NULL)
        for(unsigned long i = 0; i < tsd.br_pass_size; i++)
            free(tsd.br_pass_ptr[i]);

...
}

编译运行:
在这里插入图片描述If you need the complete source code, please add the WeChat number (c17865354792)

它总共创建了8个线程,第一个线程(使用者)接收来自破解线程的破解密码,然后打印它,这个线程通过条件值与其他线程通信。其他线程使用给定或默认字典生成密码,每个线程使用不同的方法生成密码。

三个基本的破解线程根据后一种不同的情况创建密码,并在生成的单词之前或之后添加数字。另外三个线程生成由“”、“2”、“4”分隔的两个单词密码,或者什么都不生成,单词的修改与基本线程中的相同。最后一个线程生成数字密码。主循环正在读取用户输入。

总结

在网络攻击中,黑客会反复尝试以其他用户身份登录。如果黑客有一个可能的密码列表,这种方法效果最好。然而,由于这可能是一个耗时的过程,黑客有可能在代码被破解之前被管理员或用户自己检测到黑客企图。

另一方面,离线攻击的特点是,对密码的尝试次数没有网络限制。黑客的方法是从他们试图强制访问的系统中获取一个带有密码的文件。这样,这是一种比在线方法更复杂的字典攻击类型。但一旦他们有了正确的密码,他们就可以在没有人注意到的情况下登录。

Welcome to follow WeChat official account【程序猿编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苏纷享首届生态人脉会成功举办,纷享销客助力伙伴共同发展

近日&#xff0c;纷享销客&苏纷享成功举办了首届生态人脉会&#xff0c;该活动于8月3日下午在苏州东方之门举行。本次会议汇聚了来自近20家企业的销售精英&#xff0c;包括金蝶、泛微、夏谷、蚂蚁分工、创享、黑湖智造等众多知名企业。会议秉持着“建立生态、共同发展、深耕…

软工导论知识框架(九)软件项目管理

通过计划、组织、控制一系列活动&#xff0c;合理配置使用资源&#xff0c;达到既定目标的活动。项目管理优先于任何技术之前&#xff0c;并且贯穿于整个软件生命周期全过程。 一.软件规模度量 1.代码行技术 估计每个功能需要源代码&#xff08;参考类似项目的历史数据&#…

论文详解 ——《SNR-Aware Low-light Image Enhancement》

文章目录 Abstract1.Introduction2. Related Work3. Our Method3.1 Long- and Short-range Branches3.2 SNR-based Spatially-varying Feature Fusion3.3 SNR-guided Attention in Transformer3.4 Loss Function 4. Experiments4.1. Datasets and Implementation Details4.2 Co…

实验二十七、电压传输特性的测量

一、题目 利用 Multisim 测试图1 所示各电路的电压传输特性。 图 1 电压比较器 图1\,\,电压比较器 图1电压比较器 二、仿真注意事项 &#xff08;1&#xff09;仿真电路所有的 A \textrm A A 均采用虚拟电压比较器。合理选择稳压管的限流电阻&#xff0c;使其既稳压又不至于…

armbian使用1panel快速部署部署springBoot项目后端

文章目录 前言环境准备实现步骤第一步&#xff1a;Armbian安装1panel第二步&#xff1a;安装数据库第三步&#xff1a;查看数据库容器重要信息【重要】查看容器所在的网络查看容器连接地址 第四步&#xff1a;项目配置和打包第五步:构建项目镜像 前言 这里只是简单记录部署spr…

开源,微信小程序 美食便签地图(FoodNoteMap)的设计与开发

目录 0 前言 1 美食便签地图简介 2 美食便签地图小程序端开发 2.1技术选型 2.2前端UI设计 2.3主页界面 2.4个人信息界面 2.5 添加美食界面 2.6美食便签界面 2.8 美食好友界面 2.9 美食圈子界面 2.10 子页面-店铺详情界面 2.11 后台数据缓存 2.12 订阅消息通知 2.1…

FastApi-1-结合sql 增/查demo

目录 FastAPI学习记录项目结构部分接口/代码展示感受全部代码 FastAPI学习记录 fastapi已经学习有一段时间&#xff0c;今天抽时间简单整理下。 官网介绍&#xff1a; FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Py…

配置容器以使其自动启动

配置容器以使其自动启动 配置容器 利用注册表服务器上的 rsyslog-custom-cert 镜像&#xff0c;创建一个名为 logserver 的容器。 将其配置为以 systemd 服务的形式运行&#xff0c;且仅面向现有用户 william 。 该服务应命名为 container-logserver , 并应在系统重新引…

每日一题——二叉树中和为某一值的路径

题目 给定一个二叉树root和一个值 sum &#xff0c;判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。 该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点叶子节点是指没有子节点的节点路径只能从父节点到子节点&#xff0c;不能从子节点到父节点总节点…

Coreutils工具包,Windows下使用Linux命令

之前总结过两篇有关【如何在Windows系统下使用Linux的常用命令】的文章&#xff1a; GnuWin32&#xff0c;Windows下使用Linux命令 UnxUtils工具包&#xff0c;Windows下使用Linux命令 今天再推荐一个类似的工具包Coreutils 一、简介 GNU core utilities是GNU操作系统基本…

HCIP——堆叠技术

堆叠 一、简介二、堆叠的优势1、提高可靠性2、简化组网3、简化管理4、强大的网络拓展能力 三、堆叠的方式1、堆叠卡堆叠2、业务口堆叠 四、堆叠的原理1、角色2、单机堆叠3、堆叠ID4、堆叠的优先级5、堆叠的建立过程 五、堆叠的配置 一、简介 堆叠技术 — 可以将多台真是得物理…

Android之版本号、版本别名、API等级对应关系(全)(一百六十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【刷题笔记8.13】【动态规划相关】LeetCode题目:斐波那契数列、爬楼梯

【动态规划相关】LeetCode题目&#xff1a;斐波那契数列、爬楼梯 &#xff08;一&#xff09;爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 提示&#xff1a; 1 < n <…

【数学建模】清风数模更新5 灰色关联分析

灰色关联分析综述 诸如经济系统、生态系统、社会系统等抽象系统都包含许多因素&#xff0c;系统整体的发展受各个因素共同影响。 为了更好地推动系统发展&#xff0c;我们需要清楚哪些因素是主要的&#xff0c;哪些是次要的&#xff0c;哪些是积极的&#xff0c;哪些是消极的…

P1123 取数游戏

取数游戏 题目描述 一个 N M N\times M NM 的由非负整数构成的数字矩阵&#xff0c;你需要在其中取出若干个数字&#xff0c;使得取出的任意两个数字不相邻&#xff08;若一个数字在另外一个数字相邻 8 8 8 个格子中的一个即认为这两个数字相邻&#xff09;&#xff0c;求…

自动驾驶数据集汇总

1.Nuscenes 数据集链接&#xff1a;nuScenes nuscenes数据集下有多个任务&#xff0c;涉及Detection&#xff08;2D/3D&#xff09;、Tracking、prediction、激光雷达分割、全景任务、规划控制等多个任务&#xff1b; nuScenes数据集是一个具有三维目标注释的大型自动驾驶数…

从AI到人机再到人机环:十年四本书

写这四本书的初衷还是得从剑桥图书馆说起&#xff0c;自从2012年来到剑桥逐渐适应了这里的环境和学术氛围以后&#xff0c;除了与朋友们聚会聊天&#xff0c;就是准备好矿泉水和面包&#xff0c;到学校各个图书馆里去看书、找书、借书了。记得那是2013年春天的一个下午&#xf…

HLS+System Generator实现FIR低通滤波器

硬件&#xff1a;ZYNQ7010 软件&#xff1a;MATLAB 2019b、Vivado 2017.4、HLS 2017.4、System Generator 2017.4 1、MATLAB设计低通滤波器 FPGA系统时钟 50MHz&#xff0c;也是采样频率。用 MATLAB 生成 1MHz 和 10MHz 的正弦波叠加的信号&#xff0c;并量化为 14bit 整数。把…

Word(1):文章页码设置

1.需求 在文档的封皮页不设置页码&#xff0c;在目录页页码设置为罗马数字&#xff0c;在正文使用阿拉伯数字。 2.解决方法 step1&#xff1a; 在封皮页的最后&#xff0c;点击”插入“-分隔符-分节符&#xff08;下一页&#xff09; step2&#xff1a;在目录页的最后&…