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

如何在Mac OS X中获得与Linux gcc/gnu crypt(3)相同的crypt(3)功能?Linux gcc crypt(3)具有MD5和SHA512。Apple Gcc crypt(3)*仅*使用DES,c,linux,macos,md5,crypt,C,Linux,Macos,Md5,Crypt,我正在将一些c代码从Linux迁移到MacOSX(约塞米蒂)。Mac OSX crypt()函数(如我所确定的,它位于unistd.h中)与Linux中gcc/gnu上的函数不同。我在Linux和Mac OSX上有测试程序,如果使用printf显示结果,crypt()c-library函数将显示一个34个字符的字符串。Mac OSX上的相同代码只显示13个字符的字符串。一点研究表明,区别显然在于Linux crypt()库例程使用可能不同的加密算法从gnu/gcc Linux端的较长向量生成哈希

我正在将一些c代码从Linux迁移到MacOSX(约塞米蒂)。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和MacOSX平台上产生相同的结果

Apple Mac OSX是否有一个合适的crypt()函数,与gnu/gcc Linux版本等距,可能在一些开源加密库中

或者在MacOSX开发工具中是否有一个gnu/gcc等价的crypt(3)功能可用于Apple MacOSX?(我对Mac OSX非常陌生)。我正在使用clang编译器,这是从苹果下载的Xcode的一部分,目前适用于Yosemite 10.10.5,我猜我不是第一个遇到这种异常的人。谢谢你的任何信息

啊。只需一点编辑: Apple MacOSX的东西使用DES algo,因此在检查散列时会得到13个字符的结果。Gnu/gcc使用MD5 algo,因此产生34个字符的哈希。这里解释如下: 我那精致的问题;MacOSX是否有使用MD5(或SHA512)而不是DES的crypt(3)等效函数

(***第二次编辑注:这很有趣。DES很差,但MD5可以在Kali Linux中使用“hashcat”进行破解?建议访问SHA512。关于学术测试/验证的详细信息。MD5破解在这里:仍然,我的问题仍然存在。Mac OSX某处是否有MD5 crypt(3)功能??Thx。)

(请原谅我对协议的无知。Mac OS X LLVM/gcc-based crypt()功能是垃圾,硬连接到只使用DES,一个经验证的可破解散列,比MD5更糟糕。(用salt字符串命名为$6$,你会得到一个13个字符的DES散列。难以置信!)我发现了许多正确创建密码散列的方法(即MD5和SHA512)在Linux平台(perl、python等)上,它们通常使用“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。我在“ServerFault”网站上找到了这篇精彩的文章:

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

我怎么能在MacBook上创建一个像样的密码散列呢?我是一个MacOSXNoob,既然我已经确认苹果在它的.plist文件中使用了SHA512密码散列,我确信这个功能一定存在于这个奇怪(但可爱)的东西上一块外星硬件。如果有人好奇,您可以输入此文件,从终端的cmd行查看优胜美地上的“ShadowHashData”:(对不起,忘记了此文件的参考资料,发现它在上个晚上搜索,非常有用)

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

因此,看起来达尔文/约塞米蒂正在使用ok加密。我阅读了一些苹果公司关于常见加密内容的文档,但关于如何调整gcc以实际指向包含这些关键内容的库的信息却很少。当我确定如何使用时,我会在这里发布答案。

OSX没有使用其
crypt
函数进行加密很多东西。它与POSIX兼容,POSIX没有定义它的工作方式,不同的平台多年来构建了不同的解决方案。Linux不是特别“正确”,它只是另一个特定于供应商的解决方案。苹果解释了他们在crypt中使用
crypt
的基本原理(1):

该库(FreeSec 1.0)是在美国境外开发的,作为仅限美国的libcrypt encryp的无障碍替代品- 仅当与crypt()接口链接的程序仅用于身份验证时,才能从美国导出 目的和避免使用上面列出的其他程序员接口。在库中已特别小心,以便只使用 使用crypt()接口,不要拉入其他组件

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

PKBDF2的各个部分并不那么复杂,在C语言中,您需要一些具有许可证的良好实现
sudo defaults read /var/db/dslocal/nodes/Default/users/<yourusername>.plist ShadowHashData | tr -dc 0-9a-f | xxd -r -p | plutil -convert xml1 - -o -