背景:

最近要开始做K3Cloud移动,BOS平台的移动单据收费,就想单独做移动模块,搭建环境:后台SSH2,前端Android。在手机端登录时通过Ajax方式传递用户名和密码到后台校验,后台在去K3Cloud的数据库中进行匹配,那么问题来了!数据库中的密码是经过SHA1加密的,要匹配首先得先把手机客户端传过来的密码加密。呵呵……金蝶的加密方式我们不得而知,就算知道,在Java平台不一定能搞出来,我今天研究了一天发现结果对不上,最后放弃了,决定试试用Java调C#的方法去直接调用K3Cloud封装好的加密工具类。

说了这么多那我们开始吧:

环境、工具:

1、VS 2012

2、eclipse、tomcat

3、Jacob-1.18-M2

一、制作COM组建

1、先创建项目,选择window类库,起名随便哈!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Kingdee.BOS.Util;
using Kingdee.BOS; namespace TestCom
{
[Guid("E9BCF867-CD81-40d0-9591-ED28D1ED2B53")]
public interface IEncrypt
{
[DispId(1)]
string GetEncrypt(string str, string str2);
}
[Guid("33A6E58D-E1F5-4b53-B2E2-03B9F8BA2FAD"), ClassInterface(ClassInterfaceType.None)]
public class Encrypt : IEncrypt
{
public Encrypt() { } public string GetEncrypt(string passWord, string salt)
{
string pwd = ConfidentialDataSecurityUtil.GenSecurityPW(passWord, salt);
return pwd;
}
}
}

Guid的生成:打开Visual Studio Command Prompt 输入guidgen 命令调出工具。类型选择Registry Format,点击New Guid,然后COPY出来。

[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)], [DispId(3)]…

2、在项目上右击选择属性,选择页签应用程序集-->程序集信息-->勾选“使程序集COM可见”,然后在切换页签到生成-->勾选“为COM互操作注册”。

3、设置强名称:打开Visual Studio Command Prompt 输入:sn -k TestComkey.snk 生成TestComkey.snk 签名文件。

注意:如果项目中引用了其他没有源码的dll文件,并且此dll文件是没有强名称的程序集,则编译时会出现类似 "Assembly generation failed -- 引用的程序集 'Kingdee.BOS.dll' 没有强名称" 这样的错误。

我这里引用的是Kingdee.BOS.dll程序集,它不是强名称的,则需要进行以下操作:

先将K3Cloud站点WebSide目录bin下的Kingdee.BOS.dll文件复制出来放到Visual Studio Command Prompt命令工具的目录。

1.打开打开Visual Studio Command Prompt命令提示窗口;

2.创建一个新的随机密钥对:

sn -k Kingdee.BOS.snk

3.反编译目标程序集

ildasm Kingdee.BOS.dll /out=Kingdee.BOS.il

3.重新编译,附带强命名参数

ilasm Kingdee.BOS.il /dll /resource=Kingdee.BOS.res /key=Kingdee.BOS.snk /optimize

4.验证签名信息

sn -v Kingdee.BOS.dll

OK,将生成的dll文件重新引入到项目中然后编译。

4、注册TestComkey.snk签名文件:项目--属性--签名,选择刚才生成的TestComkey.snk 文件

注册完后编译项目,会在Debug目录中会生成 TestCom.dll 和TestCom.tlb。

5、手工注册COM:

打开Visual Studio Command Prompt进入Debug目录,运行命令注册:

regasm TestCom.dll /tlb:TestCom.tlb

gacutil -i TestCom.dll (执行这个命令需要TestCom.dll 具有强名称)

gacutil -i Kingdee.BOS.dll (执行这个命令需要TestCom.dll 具有强名称)

二、java 调用 Com

部署jacob

1、在开发环境中引入jacob.jar 

2、拷贝jacob-1.18-M2-x64.dll 文件到 C:\Windows\System32目录,如果是Web应用的话还需要拷贝到jdk1.6.0_13\bin目录(jdk安装目录下的bin目录)

3、新建Java类:

package com.fanfan.demo;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant; public class test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
ActiveXComponent dotnetCom = null;
dotnetCom = new ActiveXComponent("TestCom.Encrypt");
Variant var = Dispatch.call(dotnetCom,"GetEncrypt","000000","0002e61f1354ca2b837311e46ad9f343d545");
String str = var.toString(); //返回值
System.out.println(str);
} catch (Exception ex) {
ex.printStackTrace();
}
} }
Dispatch.call(dotnetCom,"GetEncrypt","000000","0002e61f1354ca2b837311e46ad9f343d545");

00000就是我的密码,"0002e61f1354ca2b837311e46ad9f343d545"是密码调料,至于啥是密码调料我不知道,反正K3Cloud框架是这么注释的,这个可以通过用户名去查找FMEMO字段获取,每次更改密码这个会变,可以再写个方法专门获取salt。

运行Java代码,控制台输出了000000加密后的密码,然后就可以通过JDBD或者Hibernate访问数据库进行密码匹配了。

效果图:

OK!终于搞定了,老板在也不用担心收费的问题了,直接操作数据库,想干啥干啥。

Java调用K3Cloud的密码加密算法实现登录密码检验的更多相关文章

  1. wordpress密码生成与登录密码验证

    一.研究wordpress时wordpess的密码密码生成与登录密码验证方式很重要 WordPress密码已成为整合的首要目标,如何征服整合,就得了解WordPress密码算法. WordPress系 ...

  2. 设置思科设备console密码、enable密码、vty登录密码

    思科设备各级密码:1)  console密码 SW2(config)#line console 0SW2(config-line)#password ciscoSW2(config-line)#log ...

  3. Oracle 修改密码(忘记登录密码,用户System)

    1.修改计算机环境变量,把oracle服务端路径放在最前面 2.输入cmd 3.输入命令:sysplus /nolog SQL>conn sys/syspwd as sysdba SQL> ...

  4. 支付宝cookie 是支付密码 不是登录密码

    开发文档/ 手机网站支付 / 产品介绍 开放平台文档中心 https://docs.open.alipay.com/203/105288

  5. ZABBIX 忘记登录密码

    ZABBIX 忘记登录密码 摘要 有些童鞋会忘记zabbix的登陆密码,今天给大家写一篇找回登陆密码~       ZABBIX 忘记登录密码 zabbix 刚刚在群里吹牛逼,由于账号比较多,脑子容易 ...

  6. Shiro自定义realm实现密码验证及登录、密码加密注册、修改密码的验证

    一:先从登录开始,直接看代码 @RequestMapping(value="dologin",method = {RequestMethod.GET, RequestMethod. ...

  7. Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()

    Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...

  8. java 调用 C# webapi

    最近项目需要 java调用  .net 的webapi. 对于get来说很简单,但是post方法遇到了些问题,最后也是曲线救国. 先看代码 Java  代码 public static void ma ...

  9. Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

    近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限, ...

随机推荐

  1. PropTypes 和组件参数验证

    我们来了到了一个非常尴尬的章节,很多初学的朋友可能对这一章的知识点不屑一顾,觉得用不用对程序功能也没什么影响.但其实这一章节的知识在你构建多人协作.大型的应用程序的时候也是非常重要的,不可忽视. 都说 ...

  2. oracle PL、SQL(概念)

    一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型 ...

  3. Github-Client(ANDROID)开源之旅(三) ------ 巧用ViewPagerIndicator

    接上篇博文:Github-Client(ANDROID)开源之旅(二) ------ 浅析ActionBarSherkLock 文中结合了网易新闻客户端讲解了开源库ActionBarSherklock ...

  4. FileZilla Server 端设置passive模式注意事项

    1,需求和问题的产生 实践中需要分布在各地的各个客户端向云端服务器上传文件,因此在阿里云服务器上安装了FileZilla Server软件作为文件FTP服务端. 客户端程序采用FTP方式向服务端传输文 ...

  5. Cognos邮件发送

    1.打开报表,点击下图的标记 2.设置发送格式收件人 3.设置报表格式 4.设置发送内容

  6. Mysql数据库表的迁移和表的复制

    同一台服务器上的,数据库之间的表的迁移: create table db.tablename as select * from db2.tablename; 此sql使用于mysql,从一台服务器上的 ...

  7. 1.3 jieba中文处理+安装

    第一次接触这个工具,是在研一上学期的一门课里.由于要做课程设计论文,我当时选择做中文分词处理,自然而然就接触到这个工具了. 但是呢,由于研究生研究方向与NLP无关,也就没有深入的研究过. 现在由于工作 ...

  8. instance of type of object.prototype.tostring 区别

    typeof typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型.   返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 6 种:   number.boolea ...

  9. python中的参数、全局变量及局部变量

    1.位置参数.关键字参数.默认参数的使用 位置参数.关键字参数 def test(x,y,z): print(x) print(y) print(z) test(1,2,3) #位置参数,必须一一对应 ...

  10. Go:sync.Once 实现单例模式

    代码: package main import ( "fmt" "sync" ) type Singleton struct{} var singleton * ...