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

我正在将一些C代码从Linux迁移到Mac OSX(优胜美地)。 Mac OSX的crypt()函数(在unistd.h中,我已经确定了)和Linux上的gcc / gnu不一样。 我在Linux和Mac OSX上有testing程序,如果使用printf显示结果,则crypt()c-library函数将显示一个34个字符的string。 Mac OSX上的相同代码仅显示一个13个字符的string。 有一些研究表明,不同之处在于,Linux crypt()库例程在gnu / gcc Linux端使用更长的向量来生成哈希,或许使用不同的encryptionalgorithm。 一些信息还表明,苹果的Mac OSX c库crypt()函数只使用DESencryption原始string加盐。 我希望我的testing代码在Linux和Mac OSX平台上产生相同的结果。

对于苹果Mac OSX,有没有一个适当的crypt()函数,等于gnu / gcc Linux版本,也许在一些开源encryption库中?

或者,在Mac OSX开发工具的某个地方有没有可用于苹果Mac OSX的gnu / gcc等效的crypt(3)函数? (我对Mac OSX很新颖)。 我使用的是clang编译器,是从Apple下载的Xcode内容的一部分,目前用于优胜美地10.10.5,我猜我不是第一个遇到这个exception的人。 感谢任何信息。

啊。 只是一点点编辑:苹果MacOSX的东西是使用DESalgorithm,因此13个字符的结果,当检查哈希。 Gnu / gcc使用MD5algorithm,因此产生了34个字符的散列。 这在这里解释: http ://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/crypt.html#crypt然后我精炼的问题; 是否有一个crypt(3)等效function的Mac OSX使用MD5(或SHA512),而不是DES?

(***第二编辑注:这很有趣,DES很差,但MD5可以在Kali Linux中使用“hashcat”进行破解?build议明显地转到SHA512。关于学术testing/validationMD5破解的详细信息是在这里: 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()function是borked垃圾,硬连线使用DES,一个成熟的可破解散列,比MD5差(用盐string作为$ 6 $,我发现了许多方法在Linux平台(perl,python等)上正确地创build密码散列(即MD5和SHA512)。它们通常使用“crypt” lib(在Linux上用gcc中的“-lcrypt”选项),或python的“passlib”,但是我的MacBook刚刚更新到Yosemite 10.10.5甚至没有“passlib”! Python 2.5.1,当前的CentOS盒子运行Python 2.6.6。令人讨厌的小Macbook使用“python –version”命令表示Python 2.7.10。我在“ServerFault”站点发现了这个优秀的post: https:// serverfault .COM /问题/ 330069 /如何到创build-AN-SHA-512散列密码换影?newreg = df160746fbcd47878d600cbe76ec8b7f

第一个python和perl脚本在Linux上工作,因为他们使用的是glibc crypt(),我猜测,但没有任何“passlib.hash”似乎存在于任何地方,Linux或Mac OS X.

如何在这个MacBook上创build一个体面的密码散列? 我是一个Mac OS X noob,因为我已经确认苹果在其.plist文件中使用SHA512密码哈希值,所以我确信这个function必须存在于这个奇怪的(但可爱的)外来硬件上。 如果有人好奇,可以在terminal的cmd行input以查看Yosemite上的“ShadowHashData”(对不起,忘了引用了这个,发现它search的是最后一个,真的很有帮助)

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

所以看起来像达尔文/优胜美地使用正确的encryption。 我读了一些关于common-crypto的苹果文档,但是关于如何调整你的gcc实际指向包含这些关键内容的库的信息很less。 当我决定如何做到这一点时,我会在这里发表答案。

OS X并没有使用它的crypt函数。 它与POSIX兼容,它没有定义它的工作原理,多年来不同的平台已经建立了不同的解决方案。 Linux不是特别“正确”,它只是另一个特定于供应商的解决方案。 苹果公司解释他们在crypt中的crypt的基本原理(1):

这个库(FreeSec 1.0)是在美国以外的地方开发的,作为对美国唯一的libcrypt加密库的替代品。 与crypt()接口链接的程序只有在使用crypt()仅用于认证目的的情况下才能从美国导出,并避免使用上面列出的其他程序员接口。 图书馆已经采取了特别的措施,只有那些只使用crypt()接口的程序才能吸引其他组件。

如果你需要跨平台的密码哈希,那么你需要用一个已知的算法来实现它,而这个算法并没有提供。 一般来说,这意味着你将需要生成自己的格式,因为实际上没有标准格式。 我建议使用PBKDF2而不是仅仅腌制SHA2,因为它包括拉伸和盐渍。 使用John the Ripper破解弱SHA512密码仍然非常快速和容易。 良好的伸展,即使相当弱密码可以保护。 (从Linux的crypt的描述看来,他们似乎正在做类似于PKBDF2的操作;可能正好是PBKDF2而没有命名)。类似的算法包括scrypt和bcrypt 。 我喜欢PBKDF2,因为它是如此无处不在,并由NIST推荐(即使有非常合理的论点,bcrypt和scrypt更强)。

PKBDF2并不是那么复杂,并且在许可证许可的情况下,您需要在C中使用一些很好的实现。 参见MGCryptor的一个例子,其中包含了使用MIT许可证在简单的ANSI C中所需要的所有部分。 特别pkcs5_pbkdf2() ,这可能正是你想要的。

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

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