`
supttkl
  • 浏览: 17708 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java 整合Ucenter (authcode)函数的算法

    博客分类:
  • java
阅读更多
自己用java整合ucenter,发现网上的都不能用。看看下php的authcode,照着写了下,发现怎么写都会有个bug,请高手搞一下。
---接口
package com.hq.encryptor;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import com.hq.encryptor.iface.PasswordEnDe;

/**
 * Ucenter论坛可逆加密算法
 * bug:解密后的字符串可能多一个或者2个字符。谁解决了请发我信箱supttkl@163.com
 * @author GAO
 * 
 */
public class UcenterPasswordEncryptor implements PasswordEnDe {
	// 密钥字符串
	private String ENCRYPTOR_KEY = "1234567890";
	private BASE64Decoder decoder = new BASE64Decoder();
	private BASE64Encoder encoder = new BASE64Encoder();

	public UcenterPasswordEncryptor() {

	}

	/**
	 * @param key 密钥
	 */
	public UcenterPasswordEncryptor(String key) {
		this.ENCRYPTOR_KEY = key;
	}

	// 加密
	public String encrypt(String password) {
		try {
			password=URLEncoder.encode(password, "UTF-8");//支持中文
			String key = ENCRYPTOR_KEY;
			int ckey_length = 4;
			key = getMd5String(key);
			String keya = getMd5String(key.substring(0, 16));
			String keyb = getMd5String(key.substring(16, 32));
			String min = String.valueOf(System.currentTimeMillis());
			min = "0.00000000 " + min.substring(0, min.length() - 3);
			String keyc = ckey_length > 0 ? getMd5String(String.valueOf(min))
					: "";
			keyc = keyc.substring(keyc.length() - 4, keyc.length());
			String cryptkey = keya + getMd5String(keya + keyc);
			int key_length = cryptkey.length();
			byte[] temp = null;
			String str_temp = "0000000000"
					+ getMd5String(password + keyb).substring(0, 16) + password;
			temp = str_temp.getBytes("UTF-8");
			int[] box = new int[256];
			for (int i = 0; i < box.length; i++) {
				box[i] = i;
			}

			char[] rndkey = new char[256];
			for (int i = 0; i <= 255; i++) {
				rndkey[i] = cryptkey.charAt(i % key_length);
			}

			for (int j = 0, i = 0; i < 256; i++) {
				j = (j + box[i] + (int) rndkey[i]) % 256;
				int tmp = box[i];
				box[i] = box[j];
				box[j] = tmp;
			}
			for (int a = 0, j = 0, i = 0; i < temp.length; i++) {
				a = (a + 1) % 256;
				j = (j + box[a]) % 256;
				int tmp = box[a];
				box[a] = box[j];
				box[j] = tmp;
				int gao = (int) temp[i];
				byte c = (byte) (gao ^ (box[(box[a] + box[j]) % 256]));
				temp[i] = c;
			}
			ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();
			ByteArrayInputStream bytearrayinputstream = new ByteArrayInputStream(
					temp);
			encoder.encode(((InputStream) (bytearrayinputstream)),
					((OutputStream) (bytearrayoutputstream)));
			String s = bytearrayoutputstream.toString();
			return keyc + s.replace("=", "");
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	private String getMd5String(String password)
			throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance("MD5");
		byte[] input = md.digest(password.getBytes());
		String hex = byteToHexString(input);
		return hex;
	}

	private String byteToHexString(byte[] res) {
		StringBuffer sb = new StringBuffer(res.length << 1);
		for (int i = 0; i < res.length; i++) {
			String digit = Integer.toHexString(0xFF & res[i]);
			if (digit.length() == 1) {
				digit = '0' + digit;
			}
			sb.append(digit);
		}
		return sb.toString();
	}
	//
	public boolean matches(String passwordToCheck, String storedPassword) {
		  if(storedPassword == null) {
	            throw new NullPointerException("storedPassword can not be null");
	        }
	        if(passwordToCheck == null) {
	            throw new NullPointerException("passwordToCheck can not be null");
	        }
	        
	        return encrypt(passwordToCheck).equals(storedPassword);
	}

	// 解密
	public String decrypt(String password) {
		try {
			
			int ckey_length = 4;
			String key = getMd5String(ENCRYPTOR_KEY);
			String keya = getMd5String(key.substring(0, 16));
			String min = String.valueOf(System.currentTimeMillis());
			min = "0.00000000 " + min.substring(0, min.length() - 3);
			
			String keyc = ckey_length > 0 ? password.substring(0, ckey_length)
					: "";
			String cryptkey = keya + getMd5String(keya + keyc);
			int key_length = cryptkey.length();
			byte[] temp = null;
			if(true){//这步为出bug的地方
				String t1 = password.substring(ckey_length, password.length());
		        ByteArrayInputStream bytearrayinputstream = new ByteArrayInputStream(t1.getBytes("UTF-8"));
		        ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();
		        decoder.decodeBuffer(((InputStream) (bytearrayinputstream)), ((OutputStream) (bytearrayoutputstream)));
		        temp=bytearrayoutputstream.toByteArray();
			}
	        
			int[] box=new int[256];
			for (int i = 0; i <box.length; i++) {
				box[i] = i;
			}
			
			char[] rndkey = new char[256];
			for (int i = 0; i <= 255; i++) {
				rndkey[i] = cryptkey.charAt(i % key_length);
			}

			for (int j = 0, i = 0; i < 256; i++) {
				j = (j + box[i] + (int) rndkey[i]) % 256;
				int tmp = box[i];
				box[i] = box[j];
				box[j] = tmp;
			}
			StringBuffer sb = new StringBuffer();
			for(int a =0, j=0, i = 0; i < temp.length; i++) {
				a = (a + 1) % 256;
				j = (j + box[a]) % 256;
				int tmp = box[a];
				box[a] = box[j];
				box[j] = tmp;
				int gao=(int)temp[i]<0? (int)temp[i]+256:(int)temp[i];
				char c =(char)(gao ^ (box[(box[a] + box[j]) % 256]));
				sb.append(c);
			}  
			String lastStr= sb.substring(26, sb.length());
			return URLDecoder.decode(lastStr, "UTF-8");
		} catch (IOException e) {
			throw new RuntimeException(e);
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException(e);
		}
	}

}

2
0
分享到:
评论
3 楼 osacar 2012-10-16  
解决没有?
2 楼 supttkl 2010-12-13  
syncml 写道
这是最接近我要的版本,不过我的中文解析出来为何还是乱码呢?》

action=synlogin&username=°®ÓãµÃÓã&uid=29&password=53ad7dbcd721215f7539ea0ce51a4dfe&email=waiyi125@123.com&time=1291195026


晕,你不会把中文先转为为UTF-8,在加密解密不就行了!
1 楼 syncml 2010-12-01  
这是最接近我要的版本,不过我的中文解析出来为何还是乱码呢?》

action=synlogin&username=°®ÓãµÃÓã&uid=29&password=53ad7dbcd721215f7539ea0ce51a4dfe&email=waiyi125@123.com&time=1291195026

相关推荐

    uc_authcode函数

    uc_authcode函数就是一个在PHP环境中广泛使用的加密工具,尤其在UCenter(统一用户中心)系统中,它为数据传输提供了一层安全防护。 uc_authcode函数主要用于对数据进行加解密操作,它采用了自定义的编码方式,结合...

    java整合Ucenter统一登陆、退出源码

    Java整合Ucenter实现统一登录和退出的源码是基于UCenter通信协议的一种技术实践,它主要解决了在多个应用系统间用户身份验证的统一问题。UCenter是一个由Discuz!开发的用户中心系统,它可以集中管理多个网站或应用的...

    UCenter中的一个可逆加密函数authcode函数代码

    authcode函数是UCenter内置的一个加密和解密函数,它能够对用户数据进行安全的加密处理,同时提供解密功能,以供合法的用户数据访问。 authcode函数的代码实现了一个可逆的加密算法,具体来说,它包含了以下几个...

    ecshop整合ucenter配置文件

    ecshop整合ucenter配置文件

    JAVA_UCenter

    【JAVA_UCenter】是专为Java开发者设计的一个组件,它实现了与Discuz! UCenter的接口对接,使得Java应用程序能够无缝地与Discuz! 社区平台进行用户身份同步、数据交互等功能。Discuz! UCenter是知名的社区论坛系统...

    整合Ucenter的CI框架

    **整合Ucenter的CI框架详解** Ucenter是Comsenz公司推出的一款用户中心系统,它集成了用户管理、权限控制、社区积分等核心功能,常用于多应用间用户的统一管理和授权。CI(CodeIgniter)框架则是一款轻量级的PHP...

    asp.net整合ucenter接口程序源码

    ASP.NET整合Ucenter接口程序源码是一套用于将ASP.NET应用程序与Comsenz的Ucenter进行集成的解决方案。Ucenter是Comsenz公司推出的一款集成了用户管理、应用互联等功能的中心化用户系统,常被用于论坛、博客、问答等...

    ucenter discuz Java api

    总的来说,Ucenter Discuz Java API为Java开发者提供了一套完善的工具,使得在Java应用中整合社区功能变得简单高效。无论是构建大型社交网站还是小型论坛插件,都能从中受益。开发者需要理解API的核心概念,熟练运用...

    asp和ucenter整合接口

    在ASP环境中,如果我们想要与UCenter进行整合,就需要通过特定的接口来实现这一功能。 首先,理解ASP和UCenter整合的基本流程: 1. **接口调用**:ASP应用需要调用UCenter的API接口,这些接口包括用户注册、登录、...

    ucenter discuz Java api接口

    ucenter discuz Java api接口ucenter discuz Java api接口ucenter discuz Java api接口ucenter discuz Java api接口ucenter discuz Java api接口

    Thinkphp整合ucenter同步登录注册退出

    通过以上步骤,我们可以成功地在Thinkphp框架中整合Ucenter,实现用户登录、注册、退出的同步操作,为用户提供一致性的体验,同时降低了开发复杂度。在实际应用中,可以根据具体需求进行功能扩展和优化,以满足更多...

    dicuz_ucenter_api (java版本)[含用法且已解决中文乱码]

    《DZ论坛Ucenter API Java版详解:解决中文乱码问题及使用指南》 DZ论坛,即Discuz!,是中国最流行的社区软件之一,其Ucenter是集成用户管理、登录验证、同步登录等功能的核心组件。为了方便Java开发者与DZ论坛进行...

    ucenter整合原理和流程

    **Ucenter 整合原理和流程详解** Ucenter 是 Comsenz 公司推出的一款用户整合解决方案,旨在统一管理多个应用中的用户数据,实现多应用之间的用户同步登录和信息共享。它由 Server 端和 Client 端两部分组成。 1. ...

    asp.net整合ucenter

    asp.net实现UCenter登录接口 http://www.kobsky.cn/post/2008/10/08/aspnete5ae9ee78eb0UCentere799bbe5bd95e68ea5e58fa3.aspx 存在中文乱码问题,但不知道怎样重新上传新版本 请重上面url地址中获取最新版本

    详解ucenter原理及第三方应用程序整合思路、方法

    ### 详解uCenter原理及第三方应用程序整合思路、方法 #### 一、uCenter的功能与价值 uCenter作为一款强大的用户中心管理系统,不仅能够实现不同PHP应用程序之间的用户数据整合,还能跨语言支持ASP/ASP.NET/PHP/JSP...

    ucdemo discuz ucenter api for java

    的用户统一管理平台,它集成了用户注册、登录、权限管理等功能,允许开发者将Ucenter与自建的应用系统进行整合,使得用户在一个应用中登录后,无需再次登录即可访问其他关联应用,极大提升了用户体验。 UCDemo的...

    ucenter 整合SNS

    6、UCenter API文档中函数的调用方法: integer uc_user_register(string username , string password , string email [, integer questionid , string answer]) 以此为例,将函数名分解为user和register,我们...

    discuz-ucenter-api-for-java

    Discuz3.2与Java 项目整合单点登陆,discuz 和 JAVA 对接需要一个中间件,它就是 Ucenter。Comsenz(康盛)的 UCenter 当前在国内的单点登录领域占据绝对份额,其完整的产品线令 UCenter 成为了账号集成方面事实上的...

    74cms整合ucenter文件包

    74cms整合ucenter文件包 修改代码: 1:将api和uc_client2个文件夹放入根目录。 2: 在admin/templates/default/sys/admin_left_tools.htm这个文件中添加: &lt;li &gt;&lt;a href="admin_uc_setting....

Global site tag (gtag.js) - Google Analytics