CXX.SV.PRIVATE_KEY.UNENCRYPTED

尝试以未经授权的方式序列化私钥

当使用未加密的密码通过基于公钥基础设施 (PKI) 的身份验证方法存储私钥,并可能导致未经授权的访问时,Klocwork 会报告 CXX.SV.PRIVATE_KEY.UNENCRYPTED 缺陷。

漏洞与风险

如果私钥被盗,可能会危及通过 PKI 进行的身份验证,因为攻击者可以使用私钥对文档进行数字签名,并冒充授权用户。

缓解与预防

我们建议使用加密技术,如密码或非空密码。

漏洞代码示例

复制
#include <QOpcUaProvider>
#include <QOpcUaKeyPair>
#include <QFile>
int main()
{
    // Generate RSA Key
    QOpcUaKeyPair key;
    key.generateRsaKey(QOpcUaKeyPair::RsaKeyStrength::Bits1024);

    // Save private key to file
    QByteArray keyData = key.privateKeyToByteArray(QOpcUaKeyPair::Cipher::Unencrypted, "password");

    QFile keyFile("privateKey.pem");
    keyFile.open(QFile::WriteOnly);
    keyFile.write(keyData);
    keyFile.close();
  }

Klocwork 在第 11 行报告 CXX.SV.PRIVATE_KEY.UNENCRYPTED 缺陷,指出“尝试以未经授权的方式序列化私钥。请考虑使用密码进行加密。”QOpcUaKeyPair::privateKeyToByteArray 方法中传递了 QOpcUaKeyPair::Cipher::Unencrypted,这意味着私钥使用未加密的密码进行存储,容易遭到未经授权的访问。

修正代码示例

复制
#include <QOpcUaProvider>
#include <QOpcUaKeyPair>
#include <QFile>
int main()
{
    // Generate RSA Key
    QOpcUaKeyPair key;
    key.generateRsaKey(QOpcUaKeyPair::RsaKeyStrength::Bits1024);
    QByteArray keyData = key.privateKeyToByteArray(QOpcUaKeyPair::Cipher::Aes128Cbc, "K016w813");

    QFile keyFile("privateKey.pem");
    keyFile.open(QFile::WriteOnly);
    keyFile.write(keyData);
    keyFile.close();
  }

Klocwork 不再报告 CXX.SV.PRIVATE_KEY.UNENCRYPTED 缺陷,因为已针对私钥使用密码 Aes128Cbc 和 K016w813 进行所需的加密。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析和 PK.UNENC.SINK 知识库。