crypt(text,"k7")
我查了一下,'k7'是盐的意思,但我不知道这意味着什么,也不知道会有什么样的输出结果,有人知道吗?
描述
crypt()是密码加密函数。它基于数据加密标准算法,并进行了一些变化(其中之一是)以防止使用硬件实现进行密钥搜索。
key是用户输入的密码。
salt是一个由集合[a-zA-Z0-9./]中选择的两个字符组成的字符串。该字符串用于以4096种不同的方式扰动算法。
其他答案都是正确的,但迄今为止没有人解释为什么要加盐。
维基百科有关于盐和彩虹表的一个好页面,这就是我们需要盐的主要原因。
没有盐,密码学基本上只是一个单向散列函数。它会输入一个密码并返回该密码的哈希值。 彩虹表
提供了一种优化的方法来打败这个哈希的“单向”特性,并且得到原始密码。
如果您设法获取了已哈希的密码(通过某些数据库漏洞或访问/etc/passwd
或/etc/shadow
文件),您理论上可以知道很多人的密码。
盐添加了一个额外的“随机”因素。您需要创建一个随机的盐并在某处存储它(与密码在一起也可以,但分开更好)。现在,不止一个彩虹表组是足够的,您突然需要 65,536 组这样的表(在两字节盐的情况下)。盐也可以与密码分开存储,增加了一个额外的障碍。
盐还有助于防止拥有相同密码的用户看起来像是有相同的密码;盐通常是随机选择的,如果盐不同,则哈希密码将非常不同。
我还要指出这篇博客文章,解释了一些密码基础知识,我觉得很有启发性。
正如Randolpho所指出的那样,这是一种针对文本的单向哈希处理过程。
crypt()的标准用途是存储密码。显然,将密码以明文形式存储是非常不明智的。相反,crypt()用于生成密码的哈希值。当您输入密码时,会对其应用crypt(),然后比较两个哈希值。
基本上,crypt()的功能是将文本转换为一些新文本,从中无法恢复原始文本,但生成两个不同密钥的相同哈希的概率很低。
crypt函数接受一个密码字符串key和一个盐字符数组(下面会描述),并返回以另一个盐开头的可打印ASCII字符串。据信,根据该函数的输出,找到能够产生该输出的key的最佳方法是猜测key的值,直到找到原始值为止。