【问题标题】:How to use bcrypt in OpenSSL?如何在 OpenSSL 中使用 bcrypt?
【发布时间】:2019-05-29 11:47:38
【问题描述】:

我想使用 bcrypt 加密来存储密码,并且我知道 OpenSSL 实现了 Blowfish Cipher(我假设是相同的东西)。

我对本页显示的代码进行了一些改编https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption 并想出了这个:

int OpenSSLEncrypt(
    unsigned char* plaintext, 
    int plaintext_len, 
    unsigned char* key,
    unsigned char* iv, 
    unsigned char* ciphertext) 
{
    EVP_CIPHER_CTX *ctx;

    int len;

    int ciphertext_len;

    if (!(ctx = EVP_CIPHER_CTX_new())) OpenSSLHandleErrors();

    if (1 != EVP_EncryptInit_ex(ctx, EVP_bf_cbc(), 0, key, 0))
        OpenSSLHandleErrors();

    if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
        OpenSSLHandleErrors();
    ciphertext_len = len;

    if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) 
        OpenSSLHandleErrors();

    ciphertext_len += len;

    /* Clean up */
    EVP_CIPHER_CTX_free(ctx);

    return ciphertext_len;
}

int OpenSSLDecrypt(
    unsigned char* ciphertext, 
    int ciphertext_len, 
    unsigned char* key,
    unsigned char* iv, 
    unsigned char* plaintext)
{
    EVP_CIPHER_CTX *ctx;
    int len;
    int plaintext_len;

    if (!(ctx = EVP_CIPHER_CTX_new())) OpenSSLHandleErrors();

    if (1 != EVP_DecryptInit_ex(ctx, EVP_bf_cbc(), NULL, key, 0))
        OpenSSLHandleErrors();

    if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
        OpenSSLHandleErrors();
    plaintext_len = len;

    if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) 
        OpenSSLHandleErrors();

    plaintext_len += len;

    /* Clean up */
    EVP_CIPHER_CTX_free(ctx);

    return plaintext_len;
}

但是我从 OpenSSLEncrypt(...) 获得的密码长度取决于明文输入参数的长度,这不是我所期望的。无论密码的长度如何,我都希望输出长度为 64 字节。

另外,我不知道 EVP_EncryptInit_ex 是否需要用于 EVP_bf_cbc 的 iv(初始化向量),并且我没有找到可以帮助我解决此问题的文档。

【问题讨论】:

  • 你为什么认为 bcrypt 只是 Blowfish?
  • 密码学中你能学到的最好的一课,当密码学家已经完成工作时,不要自己动手:github.com/libressl-portable/openbsd/blob/master/src/lib/libc/…
  • Blowfish 和 BCrypt 不是一回事。 Blowfish 是一种密码密码,BCrypt 是一种密码散列算法基于河豚。
  • 最后,我不建议在任何密码散列方案中跳过 IV,它会使您的软件面临彩虹表攻击(请参阅我的第一条评论)
  • 您的代码正在做的是河豚-CBC。 Bcrypt 与它无关。不清楚你在问什么。

标签: c openssl bcrypt libcrypto


【解决方案1】:

正如 cmets 中指出的那样,我错误地假设 Blowfish 和 BCrypt 是同一个东西,只是因为我在某处读到 B 代表 Blowfish。

我最终遵循了 Cinder Biscuits 的建议,即使用 bcrypt 的 OpenBSD 实现,可在

https://github.com/libressl-portable/openbsd/blob/master/src/lib/libc/crypt/bcrypt.c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2012-05-01
    相关资源
    最近更新 更多