自己用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);
}
}
}
分享到:
相关推荐
uc_authcode函数就是一个在PHP环境中广泛使用的加密工具,尤其在UCenter(统一用户中心)系统中,它为数据传输提供了一层安全防护。 uc_authcode函数主要用于对数据进行加解密操作,它采用了自定义的编码方式,结合...
Java整合Ucenter实现统一登录和退出的源码是基于UCenter通信协议的一种技术实践,它主要解决了在多个应用系统间用户身份验证的统一问题。UCenter是一个由Discuz!开发的用户中心系统,它可以集中管理多个网站或应用的...
authcode函数是UCenter内置的一个加密和解密函数,它能够对用户数据进行安全的加密处理,同时提供解密功能,以供合法的用户数据访问。 authcode函数的代码实现了一个可逆的加密算法,具体来说,它包含了以下几个...
ecshop整合ucenter配置文件
【JAVA_UCenter】是专为Java开发者设计的一个组件,它实现了与Discuz! UCenter的接口对接,使得Java应用程序能够无缝地与Discuz! 社区平台进行用户身份同步、数据交互等功能。Discuz! UCenter是知名的社区论坛系统...
**整合Ucenter的CI框架详解** Ucenter是Comsenz公司推出的一款用户中心系统,它集成了用户管理、权限控制、社区积分等核心功能,常用于多应用间用户的统一管理和授权。CI(CodeIgniter)框架则是一款轻量级的PHP...
ASP.NET整合Ucenter接口程序源码是一套用于将ASP.NET应用程序与Comsenz的Ucenter进行集成的解决方案。Ucenter是Comsenz公司推出的一款集成了用户管理、应用互联等功能的中心化用户系统,常被用于论坛、博客、问答等...
总的来说,Ucenter Discuz Java API为Java开发者提供了一套完善的工具,使得在Java应用中整合社区功能变得简单高效。无论是构建大型社交网站还是小型论坛插件,都能从中受益。开发者需要理解API的核心概念,熟练运用...
在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接口
通过以上步骤,我们可以成功地在Thinkphp框架中整合Ucenter,实现用户登录、注册、退出的同步操作,为用户提供一致性的体验,同时降低了开发复杂度。在实际应用中,可以根据具体需求进行功能扩展和优化,以满足更多...
《DZ论坛Ucenter API Java版详解:解决中文乱码问题及使用指南》 DZ论坛,即Discuz!,是中国最流行的社区软件之一,其Ucenter是集成用户管理、登录验证、同步登录等功能的核心组件。为了方便Java开发者与DZ论坛进行...
**Ucenter 整合原理和流程详解** Ucenter 是 Comsenz 公司推出的一款用户整合解决方案,旨在统一管理多个应用中的用户数据,实现多应用之间的用户同步登录和信息共享。它由 Server 端和 Client 端两部分组成。 1. ...
asp.net实现UCenter登录接口 http://www.kobsky.cn/post/2008/10/08/aspnete5ae9ee78eb0UCentere799bbe5bd95e68ea5e58fa3.aspx 存在中文乱码问题,但不知道怎样重新上传新版本 请重上面url地址中获取最新版本
### 详解uCenter原理及第三方应用程序整合思路、方法 #### 一、uCenter的功能与价值 uCenter作为一款强大的用户中心管理系统,不仅能够实现不同PHP应用程序之间的用户数据整合,还能跨语言支持ASP/ASP.NET/PHP/JSP...
的用户统一管理平台,它集成了用户注册、登录、权限管理等功能,允许开发者将Ucenter与自建的应用系统进行整合,使得用户在一个应用中登录后,无需再次登录即可访问其他关联应用,极大提升了用户体验。 UCDemo的...
6、UCenter API文档中函数的调用方法: integer uc_user_register(string username , string password , string email [, integer questionid , string answer]) 以此为例,将函数名分解为user和register,我们...
Discuz3.2与Java 项目整合单点登陆,discuz 和 JAVA 对接需要一个中间件,它就是 Ucenter。Comsenz(康盛)的 UCenter 当前在国内的单点登录领域占据绝对份额,其完整的产品线令 UCenter 成为了账号集成方面事实上的...
74cms整合ucenter文件包 修改代码: 1:将api和uc_client2个文件夹放入根目录。 2: 在admin/templates/default/sys/admin_left_tools.htm这个文件中添加: <li ><a href="admin_uc_setting....