C语言中的crypt()函数是做什么用的?

5
crypt(text,"k7")

我查了一下,'k7'是盐的意思,但我不知道这意味着什么,也不知道会有什么样的输出结果,有人知道吗?


3
SO不是man手册的替代品。 - Nifle
5个回答

12

来自crypt Man page.

描述

crypt()是密码加密函数。它基于数据加密标准算法,并进行了一些变化(其中之一是)以防止使用硬件实现进行密钥搜索。

key是用户输入的密码。

salt是一个由集合[a-zA-Z0-9./]中选择的两个字符组成的字符串。该字符串用于以4096种不同的方式扰动算法。


4
对于准确地使用单词“perturb”来描述算法,并给予“+1”的评价,很不错。 - Matthew Scharley
4
应该将这交给man页的作者,但还是谢谢! - Adam Matan

12

其他答案都是正确的,但迄今为止没有人解释为什么要加盐。

维基百科有关于彩虹表的一个好页面,这就是我们需要盐的主要原因。

没有盐,密码学基本上只是一个单向散列函数。它会输入一个密码并返回该密码的哈希值。 彩虹表提供了一种优化的方法来打败这个哈希的“单向”特性,并且得到原始密码。

如果您设法获取了已哈希的密码(通过某些数据库漏洞或访问/etc/passwd/etc/shadow文件),您理论上可以知道很多人的密码。

盐添加了一个额外的“随机”因素。您需要创建一个随机的盐并在某处存储它(与密码在一起也可以,但分开更好)。现在,不止一个彩虹表组是足够的,您突然需要 65,536 组这样的表(在两字节盐的情况下)。盐也可以与密码分开存储,增加了一个额外的障碍。

盐还有助于防止拥有相同密码的用户看起来像是有相同的密码;盐通常是随机选择的,如果盐不同,则哈希密码将非常不同。

我还要指出这篇博客文章,解释了一些密码基础知识,我觉得很有启发性。


@VladimirF,您是指这个答案中的“salt”一词吗? - Mamun

1

正如Randolpho所指出的那样,这是一种针对文本的单向哈希处理过程。

crypt()的标准用途是存储密码。显然,将密码以明文形式存储是非常不明智的。相反,crypt()用于生成密码的哈希值。当您输入密码时,会对其应用crypt(),然后比较两个哈希值。

基本上,crypt()的功能是将文本转换为一些新文本,从中无法恢复原始文本,但生成两个不同密钥的相同哈希的概率很低。


0

C手册 - 加密

crypt函数接受一个密码字符串key和一个盐字符数组(下面会描述),并返回以另一个盐开头的可打印ASCII字符串。据信,根据该函数的输出,找到能够产生该输出的key的最佳方法是猜测key的值,直到找到原始值为止。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接