CRYPT - Linux手册页

时间:2019-08-20 18:00:05  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2018-04-30

名称

crypt,crypt_r-密码和数据加密

语法

#define _XOPEN_SOURCE       /* See feature_test_macros(7) */
#include <unistd.h>

char *crypt(const char *key, const char *salt);

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <crypt.h>

char *crypt_r(const char *key, const char *salt,
              struct crypt_data *data);

与-lcrypt链接。

说明

crypt()是密码加密功能。它基于数据加密标准算法,该算法具有(除其他目的外)旨在阻止使用密钥搜索的硬件实现的变体。

key是用户输入的密码。

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

通过取密钥的前八个字符中每个字符的最低7位,可以得到一个56位的密钥。此56位密钥用于重复加密恒定字符串(通常是由全零组成的字符串)。返回的值指向加密的密码,该密码是一系列13个可打印的ASCII字符(前两个字符代表盐本身)。返回值指向静态数据,其静态内容将被每次调用覆盖。

警告:密钥空间由2 ** 56等于7.2e16的可能值组成。使用大型并行计算机可以穷举搜索该关键空间。可以使用诸如crack(1)之类的软件,该软件将搜索此密钥空间中通常由人类使用的部分以获取密码。因此,密码选择至少应避免使用常见的单词和名称。建议使用在选择过程中检查可破解密码的passwd(1)程序。

DES算法本身具有一些怪癖,这些怪癖使crypt()接口的使用成为密码验证以外的其他选择。如果您打算将crypt()接口用于加密项目,请不要这样做:获得有关加密的好书以及广泛使用的DES库之一。

crypt_r()是crypt()的可重入版本。数据指向的结构用于存储结果数据和簿记信息。除了分配它之外,调用者唯一需要做的就是在第一次调用crypt_r()之前将data-> initialized设置为零。

返回值

成功后,将返回指向加密密码的指针。错误时,返回NULL。

错误说明

EINVAL
盐格式错误。
ENOSYS
未实现crypt()函数,可能是由于美国的出口限制。
EPERM
/ proc / sys / crypto / fips_enabled具有非零值,并且尝试使用弱加密类型(例如DES)。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
crypt()Thread safetyMT-Unsafe race:crypt
crypt_r()Thread safetyMT-Safe

遵循规范

crypt():POSIX.1-2001,POSIX.1-2008,SVr4、4.3BSD。 crypt_r()是GNU扩展。

备注

Availability in glibc

crypt(),encrypt(3)和setkey(3)函数是POSIX.1-2008 XSI用于加密的选项组的一部分,并且是可选的。如果接口不可用,则没有定义符号常量_XOPEN_CRYPT,或者将其定义为-1,并且可以在运行时使用sysconf(3)检查可用性。如果下游发行版已从glibc crypt切换到libxcrypt,则可能是这种情况。在这种发行版中重新编译应用程序时,程序员必须检测_XOPEN_CRYPT是否不可用,并包含函数原型;否则,libxcrypt是与ABI兼容的直接替换。

Features in glibc

此函数的glibc版本支持其他加密算法。

如果salt是一个以" $ id $"字符开头的字符串,然后是一个以" $"结尾的字符串,那么结果的格式为:

$ id $ salt $已加密

id标识用于代替DES的加密方法,然后确定如何解释其余的密码字符串。支持以下id值:

ID |方法 1 | MD5 2a |河豚(不在主线glibc中;在某些情况下添加 | Linux发行版) 5 | SHA-256(自glibc 2.7起) 6 | SHA-512(自glibc 2.7起)

因此,加密的$ 5 $ salt $和加密的$ 6 $ salt $分别包含使用基于SHA-256和SHA-512的功能加密的密码。

" salt"代表盐中" $ id $"之后的最多16个字符。密码字符串的"加密"部分是实际计算出的密码。此字符串的大小是固定的:

MD522 characters
SHA-25643 characters
SHA-51286 characters

"盐"和"加密"中的字符来自集合[a-zA-Z0-9./]。在MD5和SHA实现中,整个密钥很重要(而不是仅DES中的前8个字节)。

从glibc 2.7开始,SHA-256和SHA-512实现支持用户提供的散列回合数,默认为5000。如果盐中的" $ id $"字符后跟" ​​rounds = xxx $",其中xxx是整数,则结果的形式为

$ id $ rounds = yyy $ salt $已加密

其中yyy是实际使用的哈希轮数。如果xxx小于1000,则实际使用的回合数为1000;如果xxx大于999999999,则实际使用的回合数为999999999,否则为xxx。

另外参见

登录(1),密码(1),加密(3),密码(3),密码(5)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/