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

Rus*_*ure 7 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个字符的结果.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)等效函数?

(***第二次编辑注意:这很有趣.DES很差,但MD5可以在Kali Linux中使用"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()函数是borked垃圾,仅限硬连线使用DES,一个经过验证的可破解散列,比MD5差.(用salt字符串调用$ 6 $,你会得到一个13字符的DES哈希.令人难以置信!)我发现了很多方法可以在Linux平台上正确创建密码哈希(即MD5和SHA512)(perl,python,它们通常使用"crypt"lib(在Linux上使用gcc中的"-lcrypt"选项),或者使用python的"passlib".但我的MacBook,刚更新到优胜美地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密码哈希,我确信这个功能必须存在于这个奇怪(但可爱)的外星硬件上.如果一个人好奇,你可以输入这个以在Yosemite上看到你的"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 -
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ier 3

OS X 不会将其crypt功能用于任何用途。它具有与 POSIX 的兼容性,而 POSIX 并没有定义它的工作原理,并且多年来不同的平台构建了不同的解决方案。Linux 并不是特别“正确”,它只是另一个特定于供应商的解决方案。Apple 解释了 in 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 提供它。

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