我正在寻找一个解密函数的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;
}
下面是从this article的加密和散列的概念区分的总结摘录:
密码仍然是网上认证的主要手段,当存储在服务器上必须受到保护。加密是一种选择,但它在这个应用中固有的弱点,因为服务器身份验证密码必须有钥匙解密。谁偷了加密密码的文件时,攻击也可能窃取密钥。
散列是一个更好的选择,特别是恰当使用的盐,根据数学家安德鲁Regenscheid和美国国家标准研究所的计算机科学家约翰·凯尔西和技术的计算机安全部。
加密是一种双向功能;什么是加密可以使用正确的密钥进行解密。散列法,但是,是一个单向函数打乱明文产生唯一的消息摘要。有了正确设计的算法,有没有办法扭转散列过程来揭示原始密码。那么谁偷散列密码的文件,攻击者必须猜测密码。 (重点煤矿)
同时,(从评论)这个link清楚地指出:地下室是用来计算密码哈希库函数...
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
的已知结果相匹配。如果是这样,密码匹配。
维基百科文章关于crypt状态:
摘录1:
地下室是用来计算可用于存储用户帐户密码,同时保持它们相对安全(一passwd文件)的密码散列库函数。
摘录2:
这在技术上是不是因为数据加密(所有位零)是被保密;它广泛众所周知提前。然而,DES的特性之一是,它是对一键恢复非常有抵抗性,即使在已知明文的情况下脸。这在理论上是可能的是两个不同的密码可能导致完全相同的哈希值。因此,密码从未“解密”:它仅用于计算结果,以及匹配结果推定为证明,密码是“相同的”。
所以这是答案的问题:“密码是从来没有‘解密’”