如何从C程序创建影子密码

时间:2017-01-09 22:41:49

标签: c linux

函数crypt()返回类似TyVkFBglLfEGw的字符串,当我的Ubuntu机器上的所有密码都像 $6$Ty8Ew9/O$V/ck4Apc7VOOqobhenO5.f6ccsVdCpQy5H6fyuNzCaDG.LxFnUWKHOobkpRQQtl.1cFG8BLAdfWjNbLiSxKXF/

我认为我的机器使用SHA512算法。如何在C程序中创建像/etc/shadow文件中的散列字符串?

2 个答案:

答案 0 :(得分:4)

如果您阅读man page for crypt;特别是关于Glibc注意到的那篇文章,它提到了以下内容:

The glibc2 version of this function supports additional encryption
algorithms.

If salt is a character string starting with the characters "$id$"
followed by a string terminated by "$":

      $id$salt$encrypted
然后,而不是使用DES机器,id识别加密    使用的方法然后确定密码的其余部分    字符串被解释。支持以下id值:

      ID  | Method
      ─────────────────────────────────────────────────────────
      1   | MD5
      2a  | Blowfish (not in mainline glibc; added in some
          | Linux distributions)
      5   | SHA-256 (since glibc 2.7)
      6   | SHA-512 (since glibc 2.7)

所以$ 5 $ salt $ encrypted是一个SHA-256编码的密码和    $ 6 $ salt $ encrypted是一个SHA-512编码的。

这意味着您应该将一个字符串作为包含字符串$6$salt的salt传入,以使其生成sha-512地穴,例如。

char *salt = "$6$pt4wu5ns";
char *password = "muppet show";

printf("%s\n", crypt(password, salt));

答案 1 :(得分:-3)

这是一个关于如何实现sha1算法的网站。

http://bradconte.com/sha1_c

通常我会描述算法,但确实存在;没有任何内容,只需将这些位与一系列复杂的加法和移位混淆。棘手的一点是让它与其他人完全一致; s sha1代码。