温馨提示×

如何利用OpenSSL进行数字签名验证

小樊
41
2025-08-15 19:03:15
栏目: 云计算

使用OpenSSL进行数字签名验证的步骤如下:

准备工作

  1. 获取公钥

    • 确保你有签名者的公钥文件(通常是.pem格式)。
  2. 获取签名文件和原始数据

    • 签名文件(通常是.sig.pem格式)。
    • 原始数据文件(可以是任意格式,如文本文件)。

验证步骤

方法一:使用OpenSSL命令行工具

  1. 验证签名

    openssl dgst -sha256 -verify public_key.pem -signature signature_file.sig original_data_file 
    • -sha256:指定使用的哈希算法(根据实际情况选择,如SHA-1、SHA-256等)。
    • -verify public_key.pem:指定公钥文件。
    • -signature signature_file.sig:指定签名文件。
    • original_data_file:指定原始数据文件。
  2. 解释输出

    • 如果验证成功,输出将显示Verified OK
    • 如果验证失败,输出将显示Verification Failure

方法二:使用OpenSSL编程接口(C语言示例)

如果你需要在程序中进行数字签名验证,可以使用OpenSSL的API。以下是一个简单的C语言示例:

#include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/sha.h> #include <openssl/err.h> #include <stdio.h> #include <stdlib.h> int verify_signature(const char *public_key_file, const char *signature_file, const char *original_data_file) { FILE *fp = fopen(public_key_file, "r"); if (!fp) { perror("Unable to open public key file"); return 0; } RSA *rsa = PEM_read_RSA(fp, NULL, NULL, NULL); fclose(fp); if (!rsa) { fprintf(stderr, "Error reading public key\n"); return 0; } fp = fopen(signature_file, "rb"); if (!fp) { perror("Unable to open signature file"); RSA_free(rsa); return 0; } unsigned char *signature = malloc(RSA_size(rsa)); size_t signature_len = fread(signature, 1, RSA_size(rsa), fp); fclose(fp); if (signature_len != RSA_size(rsa)) { fprintf(stderr, "Error reading signature\n"); free(signature); RSA_free(rsa); return 0; } fp = fopen(original_data_file, "rb"); if (!fp) { perror("Unable to open original data file"); free(signature); RSA_free(rsa); return 0; } unsigned char *data = malloc(RSA_size(rsa)); size_t data_len = fread(data, 1, RSA_size(rsa), fp); fclose(fp); if (data_len != RSA_size(rsa)) { fprintf(stderr, "Error reading original data\n"); free(signature); free(data); RSA_free(rsa); return 0; } int result = RSA_verify(NID_sha256, data, data_len, signature, signature_len, rsa); free(signature); free(data); RSA_free(rsa); if (result == 1) { printf("Verification successful\n"); return 1; } else if (result == 0) { printf("Verification failed\n"); return 0; } else { fprintf(stderr, "Verification error: %s\n", ERR_error_string(ERR_get_error(), NULL)); return 0; } } int main() { const char *public_key_file = "public_key.pem"; const char *signature_file = "signature_file.sig"; const char *original_data_file = "original_data_file"; verify_signature(public_key_file, signature_file, original_data_file); return 0; } 

注意事项

  • 确保所有文件路径正确。
  • 根据实际情况选择合适的哈希算法。
  • 处理可能的错误情况,如文件读取失败、内存分配失败等。

通过以上步骤,你可以使用OpenSSL进行数字签名验证。

0