Golang MongoDB字段级加密

时间:2018-07-17 06:41:46

标签: mongodb go encryption

我正在尝试使用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的类似方法。在封送和拆组数据之前,我是否可以收听某个事件?还是有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

  

由于mongodb不支持字段级加密

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

根据您的要求,您似乎希望进行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
}

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