如何解密隐窝生成的密码()?

时间:2019-02-02 19:57:35

标签: c crypt

我要搜索的是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;
}

3 个答案:

答案 0 :(得分:3)

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的已知结果相匹配。如果是这样,则密码匹配。

答案 1 :(得分:2)

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

  

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

     

散列 是一个更好的选择,尤其是在明智地使用盐的情况下,   根据数学家Andrew Regenscheid和计算机科学家的说法   标准和国家研究所的约翰·凯尔西技术的   计算机安全部门。

     

<强> 加密 是一个双向功能;加密的内容可以解密   用正确的钥匙。散列法,但是,是一个单向函数   打乱明文产生一个唯一的消息消化。用   设计合理的算法,有没有办法扭转哈希   显示原始密码的过程。窃取文件的攻击者   然后散列密码必须猜测密码。
  (强调我的)

另外(从评论)这 link 清楚地指出:隐窝是被用于计算密码哈希...

答案 2 :(得分:2)

如约维基百科文章crypt状态:

摘录1:

  

crypt是一种库函数,用于计算密码哈希,可用于存储用户帐户密码,同时保持相对安全(passwd文件)。

摘录2:

  

这是技术上不是加密,因为数据(所有位均为零)没有被保密;事前广为人知。但是,DES的特性之一是,即使面对已知的明文情况,它也非常能抵抗密钥恢复。从理论上讲,两个不同的密码可能会导致完全相同的哈希。 因此,密码永远不会被“解密” :它仅用于计算结果,并且假定匹配结果可以证明密码是“相同的”。

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