【问题标题】:Why does different scrypt implementation produce different results?为什么不同的 scrypt 实现会产生不同的结果?
【发布时间】:2014-05-29 20:23:26
【问题描述】:

我使用this scrypt 实现了一个简单的god,用于使用Go 确定性地生成密码。我的code is here,这是相关部分的摘录:

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

但是,当我尝试基于 libscrypt 的 C 实现时,我会不会得到相同的输出。我会得到:

68 56 66 b2 86 19 2f 6e

C 代码是here,这是主要部分:

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 中的实现都产生相同的结果?我宁愿避免自己移植代码,因为我知道这在密码学中是有风险的业务。

【问题讨论】:

  • scrypt 中最常用的原语是 PBKDF2-HMAC-SHA256 和 Salsa20/8。
  • 据我所知,浏览源代码,libscrypt 和 golang 版本都使用 pbkdf2、sha256 和 salsa20/8。因此,除非我在传递参数的方式上犯了错误,否则我不明白其中的区别。
  • 这两种语言中的字符串可能使用不同的默认文本编码(utf-8 等)。检查传入的密码/盐字节数组是否匹配。
  • 我编写了代码来检查测试向量。这表明 C 程序一定有错误。

标签: scrypt


【解决方案1】:

调用库内libscrypt_scrypt方法的C代码有两个bug,导致计算出错误的结果。违规部分是:

sizeof(password)
sizeof(salt)

sizeof 将在字符串末尾包含终止 0,因此长度为 10 和 6 的“mypassword”和“mysalt”分别得到 11 和 7。因此在计算哈希时包含两个额外的 0 .

所以问题可以通过以下两种方式解决:

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

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

用于scrypt 散列函数的 saltpassword 参数。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多