我正在尝试使用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的类似方法。在封送和拆组数据之前,我是否可以收听某个事件?还是有更好的方法呢?
答案 0 :(得分:0)
由于mongodb不支持字段级加密
MongoDB v4.2现在支持Client-Side Field Level Encryption,另请参见Field Level Encryption is GA。支持两种类型:
Manual Client-Side Field Level Encryption
应用程序必须修改与构造读写操作相关的任何代码,以通过驱动程序加密库包括加密/解密逻辑。应用程序负责根据操作选择适当的数据加密密钥进行加密/解密。
Automatic Client-Side Field Level Encryption(仅在MongoDB Atlas或MongoDB Enterprise Advanced上可用)
应用程序不必修改与读/写操作关联的代码。
根据您的要求,您似乎希望进行automatic
加密/解密。您可以在Free-Tier Atlas集群上尝试此操作,请参见:Getting Started with Atlas。
使用mgo和Golang加密mongodb中的某些字段
很遗憾,此功能在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
}