15 个解决方案
#1
考试?
#2
不是,你那有源码么?
#3
不懂,帮顶
#4
楼主开了2个帖子?
#5
嗯
#6
你的需求到底是什么?能详细说说吗?
#7
我现在在测试一个网关的接口
将这些字段
String srcDeviceId = "0";
String userIdType = "1";
String userId = "00863518277990";
String spId = "1040000003";
BigInteger PIDType = new BigInteger("0");
String PID = "90120111141040000000002";
Calendar timeStamp = Calendar.getInstance();
加密后生成String类型的authenticator变量
我写的代码是:
BASE64Encoder base64 = new BASE64Encoder();
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] buffer = (srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678").getBytes();
md5.update(buffer);
String authenticator = base64.encode(md5.digest());
改了很多次,测试都通不过,测试的人让改成OPENSSL MD5的标准算法
各位大哥,帮帮忙!!!
将这些字段
String srcDeviceId = "0";
String userIdType = "1";
String userId = "00863518277990";
String spId = "1040000003";
BigInteger PIDType = new BigInteger("0");
String PID = "90120111141040000000002";
Calendar timeStamp = Calendar.getInstance();
加密后生成String类型的authenticator变量
我写的代码是:
BASE64Encoder base64 = new BASE64Encoder();
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] buffer = (srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678").getBytes();
md5.update(buffer);
String authenticator = base64.encode(md5.digest());
改了很多次,测试都通不过,测试的人让改成OPENSSL MD5的标准算法
各位大哥,帮帮忙!!!
#8
up
#9
问题绝对不是MD5和BASE64上面
srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678"
得到的是这样的字符串:
01008635182779901040000003090120111141040000000002Wed Dec 24 15:49:00 CST 200812345678
你确认是用这个字符串做MD5+BASE64吗?
如果是用MD5作验证,绝对不会用一个可以变动的内容的!时间时刻在变化,每次的MD5都不一样,怎么验证?
MD5只能做“相同内容”的验证。
举个例子,比如密码
在数据库中保存的不是密码原文而是MD5值,用户输入密码,程序把密码MD5之后再跟数据库里面的比较,如果相同就通过。
因此我断定你的问题出在“srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678"”这上面,而不是MD5
srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678"
得到的是这样的字符串:
01008635182779901040000003090120111141040000000002Wed Dec 24 15:49:00 CST 200812345678
你确认是用这个字符串做MD5+BASE64吗?
如果是用MD5作验证,绝对不会用一个可以变动的内容的!时间时刻在变化,每次的MD5都不一样,怎么验证?
MD5只能做“相同内容”的验证。
举个例子,比如密码
在数据库中保存的不是密码原文而是MD5值,用户输入密码,程序把密码MD5之后再跟数据库里面的比较,如果相同就通过。
因此我断定你的问题出在“srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678"”这上面,而不是MD5
#10
他规定的算法是Base64(MD5(srcDeviceId+userIdType+userId+spId+PIDType+PID+timeStamp+sp的sharekey))
#11
关键就是这个timeStamp!!!
这个绝对不可能是一个变化的时间!
你问问它这个timeStamp是什么意思
这个绝对不可能是一个变化的时间!
你问问它这个timeStamp是什么意思
#12
timeStamp退订的时间
他加密这个字符串是为了—加密字符串,用于验证SP是否为合法的SP,以及防止参数被篡改
他加密这个字符串是为了—加密字符串,用于验证SP是否为合法的SP,以及防止参数被篡改
#13
加密是加密,
MD5是摘要算法,不是加密算法!MD5的结果无法解密还原的!
#14
各位大哥————小弟跪求
谁有openssl md5的标准算法(JAVA)
加我QQ350528980
谁有openssl md5的标准算法(JAVA)
加我QQ350528980
#15
private String md5AndToHex(String str){
String result=null;
try {
byte[] btInput = str.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < md.length; i++) {
int val = ((int) md[i]) & 0xff;
if (val < 16)
sb.append("0");
sb.append(Integer.toHexString(val));
}
result=sb.toString();
} catch (Exception e) {
result=null;
}
return result;
}
这是MD5加密转换成16进制的算,楼主可以自己下载apache-code.jar,把byte[]转换成base64编码
String result=null;
try {
byte[] btInput = str.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < md.length; i++) {
int val = ((int) md[i]) & 0xff;
if (val < 16)
sb.append("0");
sb.append(Integer.toHexString(val));
}
result=sb.toString();
} catch (Exception e) {
result=null;
}
return result;
}
这是MD5加密转换成16进制的算,楼主可以自己下载apache-code.jar,把byte[]转换成base64编码
#1
考试?
#2
不是,你那有源码么?
#3
不懂,帮顶
#4
楼主开了2个帖子?
#5
嗯
#6
你的需求到底是什么?能详细说说吗?
#7
我现在在测试一个网关的接口
将这些字段
String srcDeviceId = "0";
String userIdType = "1";
String userId = "00863518277990";
String spId = "1040000003";
BigInteger PIDType = new BigInteger("0");
String PID = "90120111141040000000002";
Calendar timeStamp = Calendar.getInstance();
加密后生成String类型的authenticator变量
我写的代码是:
BASE64Encoder base64 = new BASE64Encoder();
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] buffer = (srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678").getBytes();
md5.update(buffer);
String authenticator = base64.encode(md5.digest());
改了很多次,测试都通不过,测试的人让改成OPENSSL MD5的标准算法
各位大哥,帮帮忙!!!
将这些字段
String srcDeviceId = "0";
String userIdType = "1";
String userId = "00863518277990";
String spId = "1040000003";
BigInteger PIDType = new BigInteger("0");
String PID = "90120111141040000000002";
Calendar timeStamp = Calendar.getInstance();
加密后生成String类型的authenticator变量
我写的代码是:
BASE64Encoder base64 = new BASE64Encoder();
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] buffer = (srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678").getBytes();
md5.update(buffer);
String authenticator = base64.encode(md5.digest());
改了很多次,测试都通不过,测试的人让改成OPENSSL MD5的标准算法
各位大哥,帮帮忙!!!
#8
up
#9
问题绝对不是MD5和BASE64上面
srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678"
得到的是这样的字符串:
01008635182779901040000003090120111141040000000002Wed Dec 24 15:49:00 CST 200812345678
你确认是用这个字符串做MD5+BASE64吗?
如果是用MD5作验证,绝对不会用一个可以变动的内容的!时间时刻在变化,每次的MD5都不一样,怎么验证?
MD5只能做“相同内容”的验证。
举个例子,比如密码
在数据库中保存的不是密码原文而是MD5值,用户输入密码,程序把密码MD5之后再跟数据库里面的比较,如果相同就通过。
因此我断定你的问题出在“srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678"”这上面,而不是MD5
srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678"
得到的是这样的字符串:
01008635182779901040000003090120111141040000000002Wed Dec 24 15:49:00 CST 200812345678
你确认是用这个字符串做MD5+BASE64吗?
如果是用MD5作验证,绝对不会用一个可以变动的内容的!时间时刻在变化,每次的MD5都不一样,怎么验证?
MD5只能做“相同内容”的验证。
举个例子,比如密码
在数据库中保存的不是密码原文而是MD5值,用户输入密码,程序把密码MD5之后再跟数据库里面的比较,如果相同就通过。
因此我断定你的问题出在“srcDeviceId + userIdType + userId + spId + PIDType.toString() + PID + timeStamp.getTime().toString() + "12345678"”这上面,而不是MD5
#10
他规定的算法是Base64(MD5(srcDeviceId+userIdType+userId+spId+PIDType+PID+timeStamp+sp的sharekey))
#11
关键就是这个timeStamp!!!
这个绝对不可能是一个变化的时间!
你问问它这个timeStamp是什么意思
这个绝对不可能是一个变化的时间!
你问问它这个timeStamp是什么意思
#12
timeStamp退订的时间
他加密这个字符串是为了—加密字符串,用于验证SP是否为合法的SP,以及防止参数被篡改
他加密这个字符串是为了—加密字符串,用于验证SP是否为合法的SP,以及防止参数被篡改
#13
加密是加密,
MD5是摘要算法,不是加密算法!MD5的结果无法解密还原的!
#14
各位大哥————小弟跪求
谁有openssl md5的标准算法(JAVA)
加我QQ350528980
谁有openssl md5的标准算法(JAVA)
加我QQ350528980
#15
private String md5AndToHex(String str){
String result=null;
try {
byte[] btInput = str.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < md.length; i++) {
int val = ((int) md[i]) & 0xff;
if (val < 16)
sb.append("0");
sb.append(Integer.toHexString(val));
}
result=sb.toString();
} catch (Exception e) {
result=null;
}
return result;
}
这是MD5加密转换成16进制的算,楼主可以自己下载apache-code.jar,把byte[]转换成base64编码
String result=null;
try {
byte[] btInput = str.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < md.length; i++) {
int val = ((int) md[i]) & 0xff;
if (val < 16)
sb.append("0");
sb.append(Integer.toHexString(val));
}
result=sb.toString();
} catch (Exception e) {
result=null;
}
return result;
}
这是MD5加密转换成16进制的算,楼主可以自己下载apache-code.jar,把byte[]转换成base64编码