我正在尝试使用mgo和Golang加密mongodb中的某些字段。由于mongodb不支持字段级加密,因此我考虑在对数据进行编码和解码时对数据进行加密和解密。

例如,在下面的结构中,我想加密名称和性别

如果我的结构像这样

type User struct {
UserID      string `json:"userID,omitempty" bson:"userID,omitempty"`
UserName    string `json:"userName,omitempty" bson:"userName,omitempty"`
UserAge   string `json:"userAge,omitempty" bson:"userAge,omitempty"`
UserGender string `json:"userGender,omitempty" bson:"userGender,omitempty"`
}

解决此问题的一种方法是将数据编码后,在将数据保存到db中之前对其进行加密,以及一种将数据发送回UI的类似方法。在编码(marshal)和拆组数据之前,我是否可以听一个事件?还是有更好的方法呢?

最佳答案



MongoDB v4.2现在支持Client-Side Field Level Encryption,另请参见Field Level Encryption is GA。支持两种类型:

  • Manual Client-Side Field Level Encryption

    应用程序必须修改与构造读写操作相关的任何代码,以通过驱动程序加密库包含加密/解密逻辑。应用程序负责为每个操作选择适当的数据加密 key 进行加密/解密。
  • Automatic Client-Side Field Level Encryption(仅在MongoDB AtlasMongoDB Enterprise Advanced上可用)

    应用程序不必修改与读/写操作关联的代码。

  • 查看您的需求,您似乎想要automatic加密/解密。您可以通过Free-Tier Atlas集群尝试此操作,请参见:Getting Started with Atlas



    不幸的是,这在mgo上不可用,但在mongo-go-driver v1.2 +上不可用。您可以在MongoDB Go driver: Client Side Encryption上看到一些示例。创建使用自动加密配置的MongoClient的示例是:
    func createEncryptedClient() *mongo.Client {
            // create a client with auto encryption
            schemaMap := map[string]interface{}{
                    "foo.bar": readJSONFile("collection_schema.json"),
            }
            autoEncOpts := options.AutoEncryption().
                    SetKeyVaultNamespace("keyvault.__datakeys").
                    SetKmsProviders(kmsProviders).
                    SetSchemaMap(schemaMap)
    
            clientOpts := options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncOpts)
            autoEncryptionClient, err := mongo.Connect(ctx, clientOpts)
            if err != nil {
                    log.Fatalf("Connect error for client with automatic encryption: %v", err)
            }
            return autoEncryptionClient
    }
    

    另请参阅github.com/mongodb-labs/field-level-encryption-sandbox

    关于mongodb - Golang MongoDB字段级加密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51374801/

    10-16 18:54