预置涉及安全问题的数据的方法原创
金蝶云社区-战斗的凯文
战斗的凯文
4人赞赏了该文章 250次浏览 未经作者许可,禁止转载编辑于2023年05月09日 15:52:24

        对于涉及安全问题的数据,如密码,密钥,TOKEN等信息,如果是静态不变的,有时需要将它们事先预置到系统中,但一定要加密保存,保存的地方可以是配置文件,也可以是数据库,一定不能硬编码在代码中,这是安全底线。


        这里以预置一个密码字符串(strPwd)到数据库的系统配置表(T_BAS_SYSTEMPROFILE),并在适当的地方使用这个密码为例:

        1,采用FIN系统提供的加密方法对需要预置的原始密码明文进行加密:

var decKey = Kingdee.K3.FIN.App.Core.ComFuncFINOthers.GetEnCodeString(ctx,strPwd);

        2,在预置脚本中将上面得到的密文(decKey)保存到系统配置表(T_BAS_SYSTEMPROFILE)中:

INSERT INTO T_BAS_SYSTEMPROFILE VALUES('YourSubSystemKey',0,0,'YourKey','decKey',0,0);

        3,每次需要使用上述密码字符串时,调用系统方法从数据库读取出密文:

var strSql = "SELECT FVALUE FROM T_BAS_SYSTEMPROFILE WHERE FCATEGORY=@CATEGORY AND FKEY=@KEY";
List<SqlParam> sqlParam = new List<SqlParam>();
sqlParam.Add(new SqlParam("@CATEGORY", KDDbType.String, 'YourSubSystemKey'));
sqlParam.Add(new SqlParam("@KEY", KDDbType.String, 'YourKey'));
var decKey = DBUtils.ExecuteScalar<string>(ctx, strSql, string.Empty, sqlParam.ToArray());

        注:由于上述密文固定不变,因此,从数据库读取后可缓存起来,后续使用时优先从缓存中读取,缓存不存在才从数据库读取,不需要每次都查询数据库。

        4,对密文进行解密,得到可以使用的明文:

var strPwd = Kingdee.K3.FIN.App.Core.ComFuncFINOthers.GetDeCodeString(ctx, decKey);

    

        由于系统配置表(T_BAS_SYSTEMPROFILE)中相关字段的长度有限,如果遇到密文较长的情况,可以改为保存到系统参数表(T_BAS_SYSPARAMETER)中。

        这里以预置一个密码字符串(strPwd)到数据库的系统参数表(T_BAS_SYSPARAMETER),并在适当的地方使用这个密码为例:

        1,采用FIN系统提供的加密方法对需要预置的原始密码明文进行加密:

var decKey = Kingdee.K3.FIN.App.Core.ComFuncFINOthers.GetEnCodeString(ctx,strPwd);

        2,在预置脚本中将上面得到的密文(decKey)保存到系统参数表(T_BAS_SYSPARAMETER)中:

INSERT INTO T_BAS_SYSPARAMETER(FID,FPARAMETEROBJID,FPARAMETERS) 
VALUES(NEWID(),'YourSubSystemKey','<YourSubSystemKey><YourKey>decKey</YourKey></YourSubSystemKey>');

        3,每次需要使用上述密码字符串时,调用系统方法(有缓存机制)读取出密文:

//服务端写法
ISystemParameterService service = Kingdee.BOS.Contracts.ServiceFactory.GetSystemParameterService(ctx);
var decKey = Convert.ToString(service.GetParamter(ctx, 0, 0, "YourSubSystemKey", "YourKey"));
//业务端写法:
var decKey = Convert.ToString(SystemParameterServiceHelper.GetParamter(ctx, 0, 0, "YourSubSystemKey", "YourKey"));

        4,对密文进行解密,得到可以使用的明文:

var strPwd = Kingdee.K3.FIN.App.Core.ComFuncFINOthers.GetDeCodeString(ctx, decKey);


图标赞 4
4人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!