我要搜索的是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;
}
答案 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的特性之一是,即使面对已知的明文情况,它也非常能抵抗密钥恢复。从理论上讲,两个不同的密码可能会导致完全相同的哈希。 因此,密码永远不会被“解密” :它仅用于计算结果,并且假定匹配结果可以证明密码是“相同的”。
这就是问题的答案:“密码永远不会被“解密””