【问题标题】:How to get same crypt(3) function in Mac OS X as Linux gcc/gnu crypt(3)? Linux gcc crypt(3) has MD5 and SHA512. Apple Gcc crypt(3) *only* uses DES如何在 Mac OS X 中获得与 Linux gcc/gnu crypt(3) 相同的 crypt(3) 函数? Linux gcc crypt(3) 有 MD5 和 SHA512。 Apple Gcc crypt(3) *仅*使用 DES
【发布时间】:2015-12-10 17:42:33
【问题描述】:

我正在将一些 c 代码从 Linux 迁移到 Mac OSX (yosemite)。 Mac OSX crypt() 函数(在 unistd.h 中,正如我所确定的)与 Linux 中的 gcc/gnu 不同。我在 Linux 和 Mac OSX 上有测试程序,如果使用 printf 显示结果,crypt() c-library 函数会显示一个 34 个字符的字符串。 Mac OSX 上的相同代码仅显示 13 个字符的字符串。一些研究表明,差异显然是 Linux crypt() 库例程从 gnu/gcc Linux 端的较长向量生成散列,可能使用不同的加密算法。一些信息还表明 Apple Mac OSX c-library crypt() 函数仅使用 DES 加密原始字符串和盐。 我想让我的测试代码在 Linux 和 Mac OSX 平台上产生相同的结果。

Apple Mac OSX 是否有适当的 crypt() 函数,与 gnu/gcc Linux 版本等距,也许在某些开源加密库中?

或者在 Mac OSX 开发工具的某处是否有可用于 Apple Mac OSX 的 gnu/gcc 等效 crypt(3) 函数? (我对 Mac OSX 很陌生)。我正在使用 clang 编译器,它是从 Apple 下载的 Xcode 的一部分,目前适用于 Yosemite 10.10.5,我猜我不是第一个遇到这种异常的人。感谢您提供任何信息。

啊。只是一点点编辑: Apple MacOSX 的东西在检查散列时使用 DES 算法,因此是 13 个字符的结果。 Gnu/gcc 使用 MD5 算法,因此产生 34 字符的散列。这在这里解释: http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/crypt.html#crypt 那我提炼的问题; Mac OSX 是否有使用 MD5(或 SHA512)而不是 DES 的 crypt(3) 等效函数?

(*** 2nd edit 注意:这很有趣。DES 很差,但是可以在 Kali Linux 中破解 MD5,使用“hashcat”?建议显然是去 SHA512。有关学术测试/验证的详细信息。 MD5 破解在这里:https://uwnthesis.wordpress.com/2013/08/07/kali-how-to-crack-passwords-using-hashcat/ 不过,我的问题仍然存在。Mac OSX 是否有 MD5 crypt(3) 函数?谢谢。)

(请原谅我对协议的无知。基于 Mac OS X LLVM/gcc 的 crypt() 函数是垃圾,硬连线到使用 DES,一种经过验证的可破坏哈希,比 MD5 更差。(用盐字符串作为 $6$ 调用它,你会得到一个 13 字符的 DES 哈希。难以置信!)我发现了许多在 Linux 平台(perl、python 等)上正确创建密码哈希的方法(即 MD5 和 SHA512) .) 他们通常使用“crypt”库(与您在 Linux 上使用 gcc 中的“-lcrypt”选项获得的相同)或用于 python 的“passlib”。但是我的 MacBook,刚刚更新到 Yosemite 10.10.5 甚至没有“passlib”!(我的旧 Fedora 机器运行 Python 2.5.1,当前的 CentOS 机器运行 Python 2.6.6。讨厌的小 Macbook 使用“python --version”命令指示 Python 2.7.10。我在“服务器故障”站点: https://serverfault.com/questions/330069/how-to-create-an-sha-512-hashed-password-for-shadow?newreg=df160746fbcd47878d600cbe76ec8b7f

我猜第一个 python 和 perl 脚本在 Linux 上工作,因为它们使用 glibc crypt(),但似乎在任何地方都不存在“passlib.hash”,Linux 或 Mac OS X。

我怎么能在这台 MacBook 上创建一个像样的密码哈希?我是一个 Mac OS X 菜鸟,因为我已经确认 Apple 在其 .plist 文件中使用 SHA512 密码哈希,所以我确信这个功能必须存在于这个奇怪(但可爱)的外星硬件的某个地方。如果有人好奇,您可以从终端的 cmd 行中输入此内容以查看您在优胜美地上的“ShadowHashData”:(抱歉,忘记参考,最后发现它在搜索,真的很有帮助)

sudo defaults read /var/db/dslocal/nodes/Default/users/<yourusername>.plist ShadowHashData | tr -dc 0-9a-f | xxd -r -p | plutil -convert xml1 - -o -

所以看起来达尔文/优胜美地正在使用 ok 加密。我阅读了一些关于通用加密内容的 Apple 文档,但是关于如何调整 gcc 以实际指向包含这些关键内容的库的信息很少。当我确定如何做到这一点时,我会在这里发布答案。

【问题讨论】:

  • 您可以直接使用glibc crypt 代码 - 您需要在 LGPL 下提供任何修改后的代码,但都是免费的。
  • md5sum 在 OSX 和 Linux 上应该相同
  • OSX 是否仍附带 OpenSSL(尽管已弃用)?如果是这样,openssl passwd -1 会生成一个与 md5 兼容的加密哈希。
  • 我有一些从字符串创建 MD5 哈希的代码,但它与 crypt(3) 所做的不同。也许只是在 Mac OS X 上安装 gcc?我不可能是第一个遇到这种情况的人。有明显的解决方法吗?
  • 欢迎来到跨平台开发的世界。 crypt,由 POSIX 定义,不要求使用特定的加密算法:算法是实现定义的。

标签: c linux macos md5 crypt


【解决方案1】:

OS X 并没有在很多事情上使用它的crypt 函数。它具有与 POSIX 的兼容性,它没有定义它的工作方式,并且多年来不同的平台构建了不同的解决方案。 Linux 并不是特别“正确”,它只是另一个特定于供应商的解决方案。 Apple 解释了他们在 crypt(1) 中使用 crypt 的理由:

这个库 (FreeSec 1.0) 是在美国以外开发的,作为美国唯一的 libcrypt 加密的无阻碍替代品- 化库。链接到 crypt() 接口的程序只能从美国导出,前提是它们仅使用 crypt() 进行身份验证 目的并避免使用上面列出的其他程序员接口。图书馆特别小心,以便只 使用 crypt() 接口不要拉入其他组件。

如果您需要跨平台密码散列,那么您需要使用crypt 不提供的已知算法来实现它。一般来说,这意味着您将需要生成自己的格式,因为确实没有标准格式。我建议使用PBKDF2 而不仅仅是加盐的 SHA2,因为它包括拉伸和加盐。使用 John the Ripper 破解弱 SHA512 密码仍然非常快速和容易。通过良好的拉伸,即使是相当弱的密码也可以得到保护。 (从 Linux 的 crypt 的描述来看,他们似乎在做类似于 PKBDF2 的事情;可能完全是 PBKDF2,但没有命名。)类似的算法包括 scryptbcrypt。我喜欢 PBKDF2,因为它无处不在并且被 NIST 推荐(尽管有非常合理的论点认为 bcrypt 和 scrypt 更强大)。

PKBDF2 的各个部分并没有那么复杂,在 C 语言中,您需要一些具有许可许可证的部分的良好实现。请参阅MGCryptor 以获取一个示例,该示例包含您在具有 MIT 许可证的简单 ANSI C 中需要的所有部分。特别注意pkcs5_pbkdf2(),这可能正是您想要的。

PBKDF2 在许多平台和语言上广泛可用。 OS X 通过 Common Crypto 提供它。

您当然也可以使用 Common Crypto 实现您自己的 Linux 版本的 crypt。但是您必须非常小心,不要在此过程中复制任何 (L)GPL 代码,除非您打算使用兼容的许可证。就个人而言,我会构建一个基于 PBKDF2 的解决方案。

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多