我正在将一些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)等效函数?
(***第二次编辑注意:这很有趣.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)功能?Thx.)
(请原谅我对协议的无知.Mac OS X LLVM /基于gcc的crypt()函数是borked垃圾,硬连线只使用DES,一个经过验证的易碎哈希,比MD5差.(用盐字符串称为$6 $,你会得到一个13 char DES哈希.令人难以置信!)我发现了很多方法可以在Linux平台(perl,python等)上正确创建密码哈希(即MD5和SHA512).它们通常使用“crypt” lib(在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”网站上找到了这篇优秀的帖子:
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/
所以看起来Darwin / Yosemite正在使用ok加密.我阅读了一些有关常见加密内容的Apple文档,但是关于如何调整gcc以实际指向包含这些关键内容的库的信息很少.当我确定如何做到这一点时,我会在这里发布答案.
This library (FreeSec 1.0) was developed outside the United States of America as an unencumbered replacement for the U.S.-only libcrypt encryp-
tion library. Programs linked against the crypt() interface may be exported from the U.S.A. only if they use crypt() solely for authentication
purposes and avoid use of the other programmer interfaces listed above. Special care has been taken in the library so that programs which only
use the crypt() interface do not pull in the other components.
如果您需要跨平台密码哈希,那么您需要使用已知算法实现它,而crypt不提供.一般来说,这意味着您将需要生成自己的格式,因为实际上没有标准格式.我建议使用PBKDF2而不仅仅是盐渍SHA2,因为它包括拉伸和盐渍.使用John the Ripper破解弱SHA512密码仍然非常快速和简单.通过良好的拉伸,甚至可以保护相当弱的密码. (从Linux的crypt的描述中,他们似乎做了类似于PKBDF2的事情;可能完全没有命名它的PBKDF2.)类似的算法包括scrypt和bcrypt.我喜欢PBKDF2,因为它无处不在并且被NIST推荐(即使有非常合理的bcrypt和scrypt更强的论据.
PKBDF2的部分并不是那么复杂,并且在C中使用许可许可证有一些很好的实现.有关具有MIT许可证的简单ANSI C中所需的所有部分的示例,请参见MGCryptor.特别注意pkcs5_pbkdf2()
,这可能正是你想要的.
PBKDF2在许多平台和语言上广泛使用. OS X通过Common Crypto提供它.
您当然可以使用Common Crypto实现您自己的Linux加密版本.但除非您打算使用兼容许可,否则您必须非常小心,不要在此过程中复制任何(L)GPL代码.就个人而言,我会构建一个基于PBKDF2的解决方案.