【发布时间】: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 定义,不要求使用特定的加密算法:算法是实现定义的。