2

MD5 が通常どのように表現されるかのように、Linux のシャドウ文字列形式を理解し、文字列を一般的な 16 進数形式に変換しようとしています。

ここの定義に従っていました http://www.akkadia.org/drepper/SHA-crypt.txt

説明したように、最後のステップ (ステップ 22) は、バイトを並べ替えた特別な base-64 エンコーディングです。

base64をデコードして元の順序に戻すためのpythonスクリプト(私の最初のpythonプログラム)を作成しました。

しかし、問題は、結果は通常の SHA1 ハッシュと同じ文字列ではありません。

たとえば、ソルト「456」を含むパスワード「123」(引用符なし)は、シャドウ文字列を生成します

$6$456$yTSewYNbvZDCsuZIN.Qdeg.0DxY5N1XddpO7qgFqjnZOqpy5QXIeMM7pdQYWIgu6Y3pSh5eYqJ21fqrlrjhJe/

私のプログラムでは、それは生成します

A922F952190B1ED9ADD9EFEDA918472364A10CABDBE79D7B5EA52A4FA6691B6A7648D429AB7BED45C7F7FE9938B8C0084F3025365C1FDC968A145192767D566A

ただし、123456 と 456123 の SHA512 ハッシュは

BA3253876AED6BC22D4A6FF53D8406C6AD864195ED144AB5C87621B6C233B548BAEAE6956DF346EC8C17F5EA10F35EE3CBC514797ED7DDD3145464E2A0BAB413

CA3D1DDE02C4B15D2E95521E259C5E08AAEA8FEAA722BA14014605249EFE3F248DB3D98AA7C4ACCBE887E1B40573D7EBA71017C5DF029C16C8D6F06B0FFDA310

それらのどれも私の結果と同じではありません。それで、影の生成方法について私が間違って理解した点はありますか? または私のコードに何か問題がありますか?

私のpythonコード(入力はbase64コード、つまりシャドウ文字列の最後の「$」の後の文字列でなければなりません):

#!/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()
4

2 に答える 2

2

見逃している最大のことは、シャドウファイルのパスワードハッシュが繰り返されることです。パスワードのハッシュ値はで123はなくsha(password + salt)sha(sha(sha(sha(password + salt) + salt) + salt)...)デフォルトで5000レベルのネストがあります。

于 2013-01-23T07:24:02.183 に答える
1

「sha256_crypt」アルゴリズムは、単なる SHA256 ハッシュではありません。独自のかなり複雑な構造であり、たまたま SHA256 を暗号化プリミティブとして使用しているため、この名前が付けられています。

rounds 値は SHA256 関数の複数の構成を必要とするだけでなく、 でsha256(sha256(...))なく、事前にいくつかの追加のセットアップ手順を伴うはるかに複雑なループです...その目標は、パスワードハッシュにはるかに適したものにすることです単によりsha256()。そうは言っても、base64 にエンコードする前の転置とカスタム base64 エンコードは、実際にはセキュリティ面で何も追加しません。実装するのが面倒になるだけです。

Akkdia.org ドキュメントの残りの部分を読むことをお勧めします。このドキュメントには、シャドウ ハッシュの計算方法が正確に記述されています。または、Passlib プロジェクトのソースにあるsha2_crypt.pyを見ることができます。これは、実装する必要があるものを示しています。関数を探してください。raw_sha256_crypt()肉はraw_sha_crypt(). v1.5.3 のソースにリンクしていることに注意してください。これは、最新バージョン(より高速ですが) も理解するのが少し難しいためです。

于 2013-01-23T16:27:21.197 に答える