如何在Mac OS X中获得与Linux gcc / gnu crypt(3)相同的crypt(3)功能? Linux gcc crypt(3)有MD5和SHA512。 Apple Gcc crypt(3)*仅*使用DES

时间:2015-09-14 16:30:38

标签: c linux macos md5 crypt

我正在将一些c代码从Linux迁移到Mac OSX(优胜美地)。 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来加密原始字符串加上salt。 我想让我的测试代码在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,我猜我不是第一个遇到这种异常的人。 Thanx任何信息。

阿。只是一点编辑: 在检查哈希时,Apple MacOSX的东西正在使用DES算法,因此是13-char结果。 Gnu / gcc使用MD5算法,因此产生了34-char的哈希值。这在这里解释: http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/crypt.html#crypt 那时我的问题很精致;是否有使用MD5(或SHA512)代替DES的Mac OSX的crypt(3)等效函数?

(***第2次编辑注意:这很有趣.DES很差,但MD5可以在Kali Linux中破解,使用" hashcat&#34 ;?建议明显转到SHA512。有关学术的详细信息测试/验证重新.MD5破解在这里:https://uwnthesis.wordpress.com/2013/08/07/kali-how-to-crack-passwords-using-hashcat/仍然,我的问题仍然存在。是否有适用于Mac OSX的MD5 crypt(3)功能?Thx。)

(请原谅我对协议的无知.Mac OS X LLVM /基于gcc的crypt()函数是borked垃圾,硬连接到使用DES,一个经过验证的可破解散列,比MD5差。(使用salt字符串调用它为$ 6 $,你将得到一个13 char DES哈希。令人难以置信!)我发现了很多方法可以在Linux平台上正确创建密码哈希(即MD5和SHA512)(perl,python等) 。)他们通常使用" crypt" lib(在Linux上使用gcc和#34; -lcrypt"选项),或者#34; passlib"用于python。但我的MacBook,刚刚更新到Yosemite 10.10.5甚至没有" passlib"!(我的旧Fedora盒子运行Python 2.5.1,现在的CentOS盒子运行Python 2.6.6。讨厌的小Macbook表示Python 2.7.10,使用" python --version"命令。我在" ServerFault"网站上找到了这篇优秀的帖子: 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密码哈希,我确信这个功能必须存在于这个奇怪(但可爱)的外星硬件上。如果一个人好奇,你可以输入这个以查看你的" ShadowHashData"在优胜美地,从码头的cmd线:(对不起,忘了参考这个,发现它搜索到最后一点,真的很有帮助)

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

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

1 个答案:

答案 0 :(得分:3)

OS X不会将其crypt函数用于任何事情。它具有与POSIX的兼容性,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中使用许可许可证有一些很好的实现。有关具有MIT许可证的简单ANSI C中所需的所有部分的示例,请参阅MGCryptor。特别注意pkcs5_pbkdf2(),这可能正是你想要的。

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

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