CRYPT - Linux手册页
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)。
Interface | Attribute | Value |
crypt() | Thread safety | MT-Unsafe race:crypt |
crypt_r() | Thread safety | MT-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个字符。密码字符串的"加密"部分是实际计算出的密码。此字符串的大小是固定的:
MD5 | 22 characters |
SHA-256 | 43 characters |
SHA-512 | 86 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/。