# SqlMap配置文件及SqlTemplate模板加密存储及解析 出于系统信息安全的原因,一些大公司有自己的信息安全规范。其中就有类似这样的配置文件不允许明文存储的需求,本orm定制版本也内置了一些API对SqlMap配置文件及SqlTemplate模板密文存储解析的需求进行支持。 * 本库内置提供了AES,DES,3DES,RSA四种加密算法支持SqlMap配置文件及SqlTemplate模板加解密存储解析功能。其中,AES,DES,3DES和标准实现略有不同,如不提供key,本库会提供了一个内置key,当然您也可以设置自己的key。RSA支持公钥加密私钥解密和私钥加密公钥解密两种模式。 ~~~ //内置4种加密算法如下 type AesEncrypt struct { PubKey string } type DesEncrypt struct { PubKey string } type TripleDesEncrypt struct { PubKey string } //RSA加密解密算法支持公钥加密私钥解密和私钥加密公钥解密两种模式,请合理设置DecryptMode type RsaEncrypt struct { PubKey string PriKey string pubkey *rsa.PublicKey prikey *rsa.PrivateKey EncryptMode int DecryptMode int } const ( RSA_PUBKEY_ENCRYPT_MODE = iota //RSA公钥加密 RSA_PUBKEY_DECRYPT_MODE //RSA公钥解密 RSA_PRIKEY_ENCRYPT_MODE //RSA私钥加密 RSA_PRIKEY_DECRYPT_MODE //RSA私钥解密 ) ~~~ * 除以上4种内置加解密算法外,本库也支持自定义加解密算法功能,您也可以使用自己实现的加密解密算法,只需要实现Cipher接口即可。 ~~~ //如需使用自定义的加密解密算法,只需实现Cipher接口即可 type Cipher interface { Encrypt(strMsg string) ([]byte, error) Decrypt(src []byte) (decrypted []byte, err error) } //SqlMapOptions中的Cipher实现了加密和解密方法 type SqlMapOptions struct { Capacity uint Extension string Cipher Cipher } //SqlTemplateOptions中的Cipher实现了加密和解密方法 type SqlTemplateOptions struct { Capacity uint Extension string Cipher Cipher } ~~~ * 本库还提供一个批量配置文件加密工具,采用sciter的Golang绑定库实现。工具传送门:[xorm tools](https://github.com/xormplus/tools)。 * 内存中缓存的是经指定解密算法解密之后的配置文件内容或模板内容。 * SqlMap配置文件及SqlTemplate模板加密存储及解析具体示例如下: ~~~ //如需使用自定义的加密解密算法,只需实现Cipher接口即可 type Cipher interface { Encrypt(strMsg string) ([]byte, error) Decrypt(src []byte) (decrypted []byte, err error) } //SqlMapOptions中的Cipher实现了加密和解密方法 type SqlMapOptions struct { Capacity uint Extension string Cipher Cipher } //SqlTemplateOptions中的Cipher实现了加密和解密方法 type SqlTemplateOptions struct { Capacity uint Extension string Cipher Cipher } //如现在我们已经使用3DES加密了SqlMap配置文件和SqlTemplate模板,则xorm初始化方式如下 var err error engine, err = xorm.NewPostgreSQL("postgres://postgres:root@localhost:5432/mblog?sslmode=disable") if err != nil { t.Fatal(err) } enc := &xorm.AesEncrypt{ PubKey: "122334", } //如自定义加解密算法,则此处传入的enc为自己实现的加解密算法,后续代码与本示例一致 err = x.RegisterSqlMap(xorm.Xml("./sql/aes", ".xml"), enc) if err != nil { t.Fatal(err) } //这里也可以new其他加密解密算法,SqlMap配置文件和SqlTemplate模板的加密结算算法可不相同 err = x.RegisterSqlTemplate(xorm.Pongo2("./sql/aes", ".stpl"), enc) if err != nil { t.Fatal(err) } //内置4种加密算法如下 type AesEncrypt struct { PubKey string } type DesEncrypt struct { PubKey string } type TripleDesEncrypt struct { PubKey string } //RSA加密解密算法支持公钥加密私钥解密和私钥加密公钥解密两种模式,请合理设置DecryptMode type RsaEncrypt struct { PubKey string PriKey string pubkey *rsa.PublicKey prikey *rsa.PrivateKey EncryptMode int DecryptMode int } const ( RSA_PUBKEY_ENCRYPT_MODE = iota //RSA公钥加密 RSA_PUBKEY_DECRYPT_MODE //RSA公钥解密 RSA_PRIKEY_ENCRYPT_MODE //RSA私钥加密 RSA_PRIKEY_DECRYPT_MODE //RSA私钥解密 ) //RSA使用示例 pukeyStr := `-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyqyVCWQBeIgY4FyLnrA1 viOq9m++OyUwXIvpEH7zN7MjeJp7nSK5PBkvv81zIbQrMQXQzTuE52QjYfMfHVoq FyK+Qxw+B/1qY3TACj8b4TlDS0IrII9u1QBRhGHmtmqJ5c6As/rIqYLQCdbmycC0 3iKBM8990Pff8uq+jqzsoQCFDexZClprR6Vbz3S1ejoFLuDUAXUfNrsudQ/7it3s Vn540kh4a9MKeSOg68TSmKKQe1huTF03uDAdPuDveFpVU/l7nETH8mFoW06QvvJR 6Dh6FC9LzJA6EOK4fNGeDzJg9e2jByng/ubJM6WeU29uri2zwnMGQ3qsCuGMXBS/ yQIDAQAB -----END PUBLIC KEY-----` var err error engine, err = xorm.NewPostgreSQL("postgres://postgres:root@localhost:5432/mblog?sslmode=disable") if err != nil { t.Fatal(err) } //公钥解密 enc := new(xorm.RsaEncrypt) enc.PubKey = pukeyStr enc.DecryptMode = xorm.RSA_PUBKEY_DECRYPT_MODE err = engine.RegisterSqlMap(xorm.Xml("./sql/rsa", ".xml"), enc) if err != nil { t.Fatal(err) } err = engine.RegisterSqlTemplate(xorm.Pongo2("./sql/rsa", ".stpl"), enc) if err != nil { t.Fatal(err) } ~~~ * 其他相关API ~~~ /*---------------------------------------------------------------------------------------------------- 1.ClearSqlMapCipher()可清除SqlMap中设置的Cipher,这样可以使用engine.LoadSqlMap(filepath)手工加载一些没有加密的配置文件 2.如果您之后又想加载一些其他加密算法存储的配置文件,也可以先清除,再重新SetSqlMapCipher()之后加载 3.当然,配置文件也可以不加密存储,遇到需要部分加密存储的配置文件可以手工调用SetSqlMapCipher()之后加载 4.注意InitSqlMap()是对整个SqlMapRootDir做统一操作,如您有区别对待的配置文件,请自行设置隔离目录,使用ClearSqlMapCipher()或SetSqlMapCipher()后调用LoadSqlMap()方法进行指定处理。 ----------------------------------------------------------------------------------------------------*/ engine.ClearSqlMapCipher() engine.SetSqlMapCipher(cipher) /*---------------------------------------------------------------------------------------------------- 1.ClearSqlTemplateCipher()可清除SqlTemplate中设置的Cipher,这样可以使用engine.LoadSqlTemplate(filepath)手工加载一些没有加密的模板文件 2.如果您之后又想加载一些其他加密算法存储的模板文件,也可以先清除,再重新SetSqlTemplateCipher()之后加载 3.当然,配置文件也可以不加密存储,遇到需要部分加密存储的配置文件可以手工调用SetSqlTemplateCipher()之后加载 4.注意InitSqlMap()是对整个SqlTemplateRootDir做统一操作,如您有区别对待的配置文件,请自行设置隔离目录,使用ClearSqlTemplateCipher()或SetSqlTemplateCipher()后调用LoadSqlTemplate()方法进行指定处理。 ----------------------------------------------------------------------------------------------------*/ engine.ClearSqlTemplateCipher() engine.SetSqlTemplateCipher(cipher) ~~~