2009-07-19 78 views
0
crypt(text,"k7") 

我查了一下,显然'k7'是盐,但我不知道这意味着什么,也不知道输出的类型是什么,任何人都知道?crypt()在C中做什么?

+2

-1因此SO不能代替手册页 – Nifle 2009-07-19 10:21:54

回答

8

crypt Man page

说明

隐窝()是密码加密 功能。它基于数据 加密标准算法 旨在(其他 东西)阻止使用硬件 实现的关键字搜索。

键是用户输入的密码。

盐是从集合[a-zA-Z0-9./]选择的两个字符的字符串 。这个 字符串用于以4096种不同方式之一扰乱算法。

+4

+1,因为它是准确的,并且可以在描述算法的实际句子中使用“perturb”这个词... – 2009-07-19 04:12:25

+3

它应该交给手册页的作者,但谢谢! – 2009-07-19 06:57:27

1

正如Randolpho指出的那样,这是对文本的单向哈希处理。

crypt()的标准用法是存储密码。显然,将密码存储为明文将非常不方便。相反,crypt()用于生成密码的散列。当你输入你的密码时,crypt()应用于该密码,然后比较两个哈希值。

本质上,crypt()的功能是将文本翻译成一些新的文本,从中不能恢复原始文本,但对两个不同的密钥生成相同散列的概率较低。

0

C Manual - Crypt

crypt函数需要一个密码,密钥,作为一个字符串,以及在下面描述,并返回其与另一种盐开始打印的ASCII字符串盐字符数组。相信在给定函数的输出的情况下,找到产生该输出的密钥的最佳方式是猜测密钥的值,直到找到密钥的原始值。

8

所有其他答案都是正确的,但到目前为止没有人解释过为什么盐在那里。

维基百科在saltsRainbow Tables上有一个很好的页面,这是我们有盐的主要原因。

没有盐,crypt基本上只是一个单向哈希函数。它需要一个密码并返回该密码的哈希版本。 Rainbow表提供了一种优化方法,用于击败此散列的“单向”特性,并取消原始密码。

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

盐会增加额外的“随机”因素。你需要创建一个随机salt并将其存储在某个地方(密码是OK,但单独更好)。现在只有一组彩虹桌是不够的,你突然需要65,536套这样的桌子(如果是双字节盐的话)。盐也可以与密码分开,增加额外的障碍。

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

我还会指出这个博客文章解释了一些password basics,我发现它非常翔实。

+0

@VladimirF,在这个答案中,你的意思是“盐”这个词吗? – Mamun 2018-01-04 14:10:27