我正在尝试使用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。支持两种类型:
应用程序必须修改与构造读写操作相关的任何代码,以通过驱动程序加密库包含加密/解密逻辑。应用程序负责为每个操作选择适当的数据加密 key 进行加密/解密。
应用程序不必修改与读/写操作关联的代码。
查看您的需求,您似乎想要
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/