c - 如何在 OpenSSL 中使用 bcrypt?
问题描述
我想使用 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 是否需要一个 iv(初始化向量)来用于 EVP_bf_cbc,而且我没有找到可以帮助我解决这个问题的文档。
解决方案
正如评论中指出的那样,我错误地假设 Blowfish 和 BCrypt 是同一个东西,只是因为我在某处读到 B 代表 Blowfish。
我最终遵循了 Cinder Biscuits 的建议,即使用 bcrypt 的 OpenBSD 实现,可在
https://github.com/libressl-portable/openbsd/blob/master/src/lib/libc/crypt/bcrypt.c
推荐阅读
- azure - Azure Wep 应用连接外部 Cloud SQL
- java - 通过比较存储为字符串列表的边值来显示三角形
- php - Oracle 数据库未使用 PHP 正确排序日期
- signalr - 如何使用 Angular 7 获取特定页面中的总活跃用户数
- php - 如何计算具有不同记录的查询?
- reporting-services - 我能否从我的自定义实用程序创建 Tableau(或任何其他报告工具)可以读取的报告文件?
- docker - 无法安装 Docker:Docker 桌面需要 Windows 10 专业版或企业版 15063 才能运行
- amp-html - AMP页面如果你使用浏览器返回,你不能点击任何其他链接
- javascript - 背包问题还是排列?如何解决我的问题?
- python - 即使使用查找工具也无法访问 macOS 上的应用程序文件夹