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

问题描述 投票:4回答:3

我正在寻找一个解密函数的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;
}
c crypt
3个回答
2
投票

下面是从this article的加密和散列的概念区分的总结摘录:

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

散列是一个更好的选择,特别是恰当使用的盐,根据数学家安德鲁Regenscheid和美国国家标准研究所的计算机科学家约翰·凯尔西和技术的计算机安全部。

加密是一种双向功能;什么是加密可以使用正确的密钥进行解密。散列法,但是,是一个单向函数打乱明文产生唯一的消息摘要。有了正确设计的算法,有没有办法扭转散列过程来揭示原始密码。那么谁偷散列密码的文件,攻击者必须猜测密码。 (重点煤矿)

同时,(从评论)这个link清楚地指出:地下室是用来计算密码哈希库函数...


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


2
投票

维基百科文章关于crypt状态:

摘录1:

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

摘录2:

这在技术上是不是因为数据加密(所有位零)是被保密;它广泛众所周知提前。然而,DES的特性之一是,它是对一键恢复非常有抵抗性,即使在已知明文的情况下脸。这在理论上是可能的是两个不同的密码可能导致完全相同的哈希值。因此,密码从未“解密”:它仅用于计算结果,以及匹配结果推定为证明,密码是“相同的”。

所以这是答案的问题:“密码是从来没有‘解密’”

© www.soinside.com 2019 - 2024. All rights reserved.