对于涉及安全问题的数据,如密码,密钥,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);