MST

星途 面试题库

面试题:MongoDB增删改查中的数据加密与传输安全

在MongoDB进行增删改查时,数据在存储和传输过程中可能面临被窃取的风险。请详细说明如何在MongoDB中实现数据加密,包括静态数据加密和传输中的数据加密,以保障增删改查操作的数据安全性。同时,说明可能会遇到的性能问题及解决方案。
15.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

静态数据加密

  1. 启用WiredTiger存储引擎加密
    • MongoDB从3.2版本开始,WiredTiger存储引擎支持透明数据加密(TDE)。要启用它,需配置一个加密密钥。首先,生成一个加密密钥文件,例如使用openssl rand -base64 96 > keyFile生成一个96字节的Base64编码密钥文件。
    • 然后在mongod.conf文件中进行配置:
    storage:
      engine: wiredTiger
      wiredTiger:
        engineConfig:
          encrypt: true
          encryptionKeyFile: /path/to/keyFile
    
    • 重启mongod服务,此时所有新写入的数据都会在磁盘上加密存储。
  2. 字段级加密
    • 使用MongoDB的客户端加密功能。可以利用MongoDB的官方驱动程序和mongodb - client - encryption库。
    • 首先生成一个主密钥(Master Key),并存储在密钥管理服务(KMS)中,如AWS KMS、Google Cloud KMS等。
    • 然后在客户端代码中,配置加密上下文。例如在Node.js中:
    const { MongoClient, ClientEncryption } = require('mongodb');
    const { promisify } = require('util');
    
    const kmsProviders = {
      aws: {
        accessKeyId: 'YOUR_AWS_ACCESS_KEY',
        secretAccessKey: 'YOUR_AWS_SECRET_KEY',
        region: 'YOUR_AWS_REGION'
      }
    };
    
    const masterKey = {
      key: 'YOUR_MASTER_KEY_FROM_KMS',
      keyAltName: 'YOUR_KEY_ALT_NAME'
    };
    
    const client = new MongoClient('mongodb://localhost:27017');
    const clientEncryption = new ClientEncryption(
      kmsProviders,
      masterKey,
      { keyVaultNamespace: 'encryption.__keyVault' },
      client
    );
    
    const encryptOptions = {
      keyId: new Uint8Array([...]), // 从KMS获取的密钥ID
      algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'
    };
    
    const encryptedField = clientEncryption.encrypt('sensitiveData', encryptOptions);
    

传输中的数据加密

  1. TLS/SSL加密
    • 为MongoDB配置TLS/SSL加密,需获取SSL证书和私钥。可以从证书颁发机构(CA)获取,也可以使用OpenSSL生成自签名证书。
    • mongod.conf文件中配置:
    net:
      tls:
        mode: requireTLS
        certificateKeyFile: /path/to/cert_and_key.pem
    
    • 客户端连接时也需要配置TLS/SSL选项。例如在MongoDB shell中:
    mongo --tls --tlsCertificateKeyFile /path/to/client.pem "mongodb://localhost:27017"
    

可能遇到的性能问题及解决方案

  1. 静态数据加密性能问题
    • 性能问题:加密和解密操作会增加CPU负载,导致写入和读取性能下降。
    • 解决方案
      • 使用高性能的CPU,以应对加密和解密带来的计算开销。
      • 调整WiredTiger存储引擎的配置参数,如cacheSizeGB,确保有足够的内存缓存数据,减少磁盘I/O。例如:
      storage:
        wiredTiger:
          engineConfig:
            cacheSizeGB: 2
      
  2. 传输中的数据加密性能问题
    • 性能问题:TLS/SSL加密会增加网络延迟和带宽消耗,特别是在高并发场景下。
    • 解决方案
      • 使用硬件加速的SSL/TLS卸载设备,将加密和解密操作从服务器CPU转移到专门的硬件设备上。
      • 优化网络拓扑,减少网络跳数和延迟,确保有足够的带宽。例如,使用高速网络连接和优化的网络设备。