一直以为有一个不好的习惯,手上的问题不解决的话,项目便没有了进度。U9的密码生成的方法苦苦追寻了一个月,夜不能寐。回顾一下,屡屡都是这样,一个问题解决时,柳暗花明一般,各种解决方案层出不穷出来了!
总结一下,有以下3种方案。
1、第三方组件,ChilkatDotNet (这个组件是要收费的)。
private string GetUserPassword(string strUserPassword,string strSalt)
{
Chilkat.Crypt2 crypt = new Chilkat.Crypt2();
crypt.HashAlgorithm = "md5";
crypt.EncodingMode = "base64";
crypt.Charset = "Unicode";
//U9C加密方式:md5 + base64 + Unicode
string strMd5Password = crypt.HashStringENC(strUserPassword);
// MD5加盐加密 加密为32位MD5大写
if (string.IsNullOrEmpty(strMd5Password))
{
Common.MessageDxUtil.ShowTips("密码序列化处理返回为null,失败了...");
}
return MD5Util.GetMD5_32(strMd5Password + strSalt).ToUpper();
}
2、纯SQL脚本的实现

1、先对明文密码进行MD5加密(之前的加密方式);
2、增加二次加密验证:需要使用sql二次校验 var sql = string.Format("select id,name from Base_User where code ='{0}' and password=upper(substring(sys.fn_VarBinToHexStr(hashbytes('MD5', CAST('{1}' as varchar(50)) + convert(char(36),base_user.salt))),3,32))", code, password);//password为md5加密后的密码。
3、U9 BP接口的实现

引用 UFIDA.U9.Base.BaseBP.Agent.dll
public string GetU9PassWord(string PassWord)
{
if (PassWord == null)
throw new Exception("请求参数不能为空");
using (BPForEngine bp = new BPForEngine())
{
ContextDTO cdto = new ContextDTO();//用友自定义的DTO类
cdto.EntCode = "100";
cdto.OrgCode = "100";
cdto.UserCode = "admin";
cdto.CultureName = "zh-CN";
cdto.WriteToContext();//重写u9的上下文
EncryptBPProxy encryptBPProxy = new EncryptBPProxy();
encryptBPProxy.Source = PassWord;
string strPWD = encryptBPProxy.Do();//zgv9FQWbaNZ2iIhNej0+jA==
string strSalt = "627C40BC-43E8-4EC2-B02F-26662114FB80";
strPWD=GetMD5_32(strPWD + strSalt).ToUpper();
return strPWD;
}
}