【问题标题】:How to decrypt a password generated in crypt()?如何解密 crypt() 中生成的密码?
【发布时间】:2019-02-02 19:57:35
【问题描述】:

我正在搜索的是 crypt(3) 函数的解密函数。阅读手册他们只让我看到login(1), passwd(1), encrypt(3), getpass(3), passwd(5),但据我所知,它们都不能用来解密字符串。

我一起写了一个小程序来说明我的观点,我要找的函数是somefunctogetbackplaintext(...)

#define _XOPEN_SOURCE
#include <unistd.h>
#include <string.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
  char *cryptated = crypt(argv[1], "aa"); // Password and salt
  if(strcmp("somepassword", somefunctogetbackplaintext(argv[1], cryptated, "aa"))) //Plain text, cryptated string, salt
    {
      printf("Success!\n");
    }
  else
    {
      printf("Not a success!\n");
    }

  return 0;
}

【问题讨论】:

  • 是什么让您认为密码实际上可以被解密?通常的密码机制不需要那个。其实我相信这个想法是他们不能被解密。
  • 我很确定 crypt 是一种单向哈希,就像 MD5 一样。
  • 您已正确阅读文档 - 非[e] 可用于解密字符串
  • @Salviati - 是的,这就是密码等通常的实现方式。散列,因此不可解密。
  • @ForceBru 传统 crypt 使用密码作为 56 位 DES 密钥并使用它来加密全零块。它不加密密码本身。

标签: c crypt


【解决方案1】:

crypt 不加密密码(因此无法解密)。取而代之的是hashes 一个给定的密码,生成一个无法还原为原始密码的字符串(因为散列函数在此过程中会丢失信息)。攻击crypt 并从其哈希中恢复密码的最实用方法可能是某种dictionary attack

但是,这些都不是检查给定密码是否正确的必要条件:

const char *password_and_salt = ...;  // e.g. from getpwent or a database
const char *input = argv[1];
if (strcmp(crypt(input, password_and_salt), password_and_salt) == 0) {
    printf("your password is correct\n");
}

换句话说,您将用户输入传递给crypt,并检查它是否与早先crypt 的已知结果相匹配。如果是,则密码匹配。

【讨论】:

    【解决方案2】:

    这是this article的摘要摘录,区分加密和散列的概念:

    密码仍然是在线身份验证的主要手段,并且必须 存储在服务器上时受到保护。加密是一种选择,但它 在这个应用程序中有一个固有的弱点,因为服务器 验证密码必须有解密它的密钥。一个 窃取加密密码文件的攻击者也可能窃取 键。

    Hashing 是一个更好的选择,尤其是在明智地使用盐的情况下, 根据数学家 Andrew Regenscheid 和计算机科学家的说法 美国国家标准与技术研究所的 John Kelsey 计算机安全部门。

    加密是双向功能;加密的东西可以解密 用正确的钥匙。然而,散列是一种单向函数 加扰纯文本以产生唯一的消息摘要。带一个 正确设计的算法,没有办法反转散列 显示原始密码的过程。窃取文件的攻击者 散列密码必须猜出密码。
    (强调我的)

    另外(来自 cmets)link 明确指出:crypt 是用于计算密码哈希的库函数...

    【讨论】:

    • excerpt 声明:crypt 是用于计算密码哈希的库函数
    • 是的。非常有趣,它直接声明 “密码永远不会“解密””
    • 没关系,其实我不是维基百科的拥有者)
    【解决方案3】:

    正如关于crypt 的维基百科文章所述:

    摘录1:

    crypt 是库函数,用于计算密码散列,可用于存储用户帐户密码,同时保持它们相对安全(passwd 文件)。

    摘录2:

    技术上不是加密,因为数据(所有位为零)未保密;提前为大家所熟知。然而,DES 的特性之一是即使面对已知的明文情况,它也非常难以恢复密钥。从理论上讲,两个不同的密码可能会产生完全相同的哈希值。 因此密码永远不会“解密”:它仅用于计算结果,匹配结果被假定为密码“相同”的证明。

    这就是问题的答案:“密码永远不会“解密””

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2012-08-14
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多