我想了解linux阴影string格式,并将string转换为一般的hex格式,就像MD5通常表示。
我在这里http://www.akkadia.org/drepper/SHA-crypt.txt
如上所述,最后一步(步骤22)是一个特殊的base-64编码,具有重新sorting的字节。
我写了一个python脚本(我的第一个python程序)来解码base64,然后把它恢复到原来的顺序。
但是问题是 ,结果与通常的SHA1哈希值不一样。
例如,密码“123”(不带引号)与盐“456”将产生阴影string
$ 6 $ 456 $ yTSeWYNbvZDCsuZIN.Qdeg.0DxY5N1XddpO7qgFqjnZOqpy5QXIeMM7pdQYWIgu6Y3pSh5eYqJ21fqrlrjhJe /
随着我的程序,它生成
A922F952190B1ED9ADD9EFEDA918472364A10CABDBE79D7B5EA52A4FA6691B6A7648D429AB7BED45C7F7FE9938B8C0084F3025365C1FDC968A145192767D566A
但是,123456和456123的SHA512散列是
BA3253876AED6BC22D4A6FF53D8406C6AD864195ED144AB5C87621B6C233B548BAEAE6956DF346EC8C17F5EA10F35EE3CBC514797ED7DDD3145464E2A0BAB413
CA3D1DDE02C4B15D2E95521E259C5E08AAEA8FEAA722BA14014605249EFE3F248DB3D98AA7C4ACCBE887E1B40573D7EBA71017C5DF029C16C8D6F06B0FFDA310
他们没有一样是我的结果。 那么,有没有什么我对阴影生成方法的错误理解? 或者我的代码错了?
我的Python代码(input应该是base64代码,即在阴影string的最后一个“$”之后的string):
#!/usr/bin/python # filename: conv.py import sys b64s = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" bm = ( \ (0,21,42), \ (22,43,1), \ (44,2,23), \ (3,24,45), \ (25,46,4), \ (47,5,26), \ (6,27,48), \ (28,49,7), \ (50,8,29), \ (9,30,51), \ (31,52,10), \ (53,11,32), \ (12,33,54), \ (34,55,13), \ (56,14,35), \ (15,36,57), \ (37,58,16), \ (59,17,38), \ (18,39,60), \ (40,61,19), \ (62,20,41), \ ('*','*',63)) sd_str = raw_input('Enter a Shadow String: ') ba = [0]*64 ba_org = [0]*64 for i in range (0,21): byte24 = 0 for j in range(0,4): byte24 += (b64s.find(sd_str[i*4+j]) << (j*6)) for j in range(0,3): ba[bm[i][2-j]] = ((byte24>>(j*8))&0x0000FF) byte24 = b64s.find(sd_str[84]) + (b64s.find(sd_str[85])<<6) ba[63] = byte24 #last byte for i in range (0,64): sys.stdout.write('%02X' % ba[i]) sys.stdout.write('\n') sys.stdout.flush()
你最大的缺失是阴影文件中的密码散列被迭代。 密码123
的哈希值不是sha(password + salt)
,它是sha(sha(sha(sha(password + salt) + salt) + salt)...)
,缺省为5000级别的嵌套。
“sha256_crypt”算法不仅仅是一个SHA256哈希算法 – 它本身就是一个相当复杂的构造,恰好使用SHA256作为一个加密原语,因此也就是名字。
不仅轮回值需要SHA256功能的多重组合,它甚至不是sha256(sha256(...))
,而是一个更为复杂的循环,事先有许多额外的设置步骤…其目标是使它更适合密码散列比简单sha256()
。 也就是说,编码到base64之前的转换,以及自定义的base64编码,并没有真正增加任何安全方面的东西,这只是让实施更加痛苦。
我建议阅读Akkdia.org文档的其余部分,其中描述了阴影哈希如何计算。 或者,您可以在Passlib项目的源代码中查看sha2_crypt.py,它显示了您需要实现的内容 – 寻找raw_sha256_crypt()
函数,这是正确的起点,尽管raw_sha256_crypt()
函数是肉的。 请注意,我将您链接到v1.5.3源代码,因为最新版本 (虽然速度更快)也有点难以理解。