crypt()在C中做了什么?

Met*_*uru 3 c crypt

crypt(text,"k7")
Run Code Online (Sandbox Code Playgroud)

我查了一下,显然'k7'是盐,但我不知道这意味着什么类型的输出将来自那个,谁都知道?

Ada*_*tan 12

来自crypt Man页面.

描述

crypt()是密码加密函数.它基于数据加密标准算法,其中包含(以及其他内容)的变体,以阻止使用密钥搜索的硬件实现.

key是用户输入的密码.

salt是从集合[a-zA-Z0-9./]中选择的双字符串.该字符串用于以4096种不同方式之一扰乱算法.

  • +1是准确的并且在描述算法的实际句子中设法使用'perturb'这个词...... (4认同)
  • 它应该提供给手册页的作者,但谢谢! (4认同)

Chr*_*uin 11

所有其他答案都是正确的,但到目前为止还没有人解释为什么盐存在.

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

如果没有salt,crypt基本上只是一种单向散列函数.它将获取密码并返回该密码的哈希版本.Rainbow表提供了一种优化方法,用于消除此哈希的"单向"特性,并退出原始密码.

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

盐为混合物添加了额外的"随机"因子.您需要创建一个随机盐并存储在某处(密码正常,但单独更好).现在一组彩虹表是不够的,你突然需要65,536套这样的表(在两字节盐的情况下).盐也可以与密码分开,增加额外的障碍.

Salt还有助于防止使用相同密码的用户拥有相同的密码; 盐通常是随机选择的,如果盐不同,则散列密码将大不相同.

我还会指出这篇博客文章,解释一些密码基础知识,我发现这些信息非常丰富.