1

この scrypt実装を使用して、Go を使用して決定論的にパスワードを生成するための単純な gode を実装しました。私のコードはここにあります。これは関連部分の抜粋です:

const keyLen = 8

// recommended cost parameters for interactive login in 2009
const N = 16384
const r = 8
const p = 1

func main() {    
    dk, _ := scrypt.Key([]byte("mypassword"), []byte("mysalt"), N, r, p, keyLen)
    for _, v := range dk {
        fmt.Printf("%x ", v)
    }

    fmt.Println()
}

コードを実行すると、次の出力が得られます。

19 e5 59 39 fe 1 2b ef

ただし、C 実装ベースの libscryptを試したところ、同じ出力は得られませんでした。私は得るでしょう:

68 56 66 b2 86 19 2f 6e

C コードはここにあり、これが主要部分です。

int N = 16384;
int r = 8;
int p = 1;
const int keyLen = 8;

int main(void) {
    unsigned char digest[keyLen];
    const unsigned char password[] = "mypassword";
    const unsigned char salt[] = "mysalt";

    libscrypt_scrypt(password, sizeof(password), salt, sizeof(salt), N, r, p, digest, keyLen);

    for (int i = 0; i < keyLen; ++i) {
        printf("%x ", digest[i]);
    }
    printf("\n");

    return 0;
}

また、さらに別の実装scrypt-janeにも出会いました。これは、ハッシュ時にさらに別の結果をもたらしました。これはおそらく、scrypt jane を使用すると、使用するハッシュ関数を選択できるためだと思います。いずれの場合もランダムソルトは使用しませんでした。

ここで検証しようとしている私自身の予感は、scrypt で使用されるハッシュ関数に関する明確な基準がないということです。もしそうなら、Go、C、python、または JavaScript での実装がすべて同じ結果を生成するようにするにはどうすればよいですか? 暗号化では危険なビジネスであることを理解しているため、コードを自分で移植することは避けています。

4

1 に答える 1

6

ライブラリ内のメソッドを呼び出す C コードにはlibscrypt_scrypt、間違った結果が計算される原因となる 2 つのバグが含まれています。問題のある部分は次のとおりです。

sizeof(password)
sizeof(salt)

には、文字列の末尾に終端のsizeof0 が含まれるため、「mypassword」と「mysalt」がそれぞれ長さ 10 と 6 を取得する代わりに、11 と 7 が取得されます。したがって、ハッシュを計算するときに 2 つの余分な 0 が含まれます。

そのため、次のいずれかを記述することで問題を解決できます。

strlen((const char *)password)
strlen((const char *)salt)

また

sizeof(password) - 1
sizeof(salt) - 1

ハッシュ関数へのソルトおよびパスワード引数用。scrypt

于 2014-05-09T20:20:36.500 に答える