使用openssl的md5标准算法.....对加密出来的128bit原始数据 再进行base64编码

时间:2023-01-10 15:13:06
如题目:对一个字符串使用openssl的md5标准算法.....对加密出来的128bit原始数据 再进行base64编码(请贴实例)

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的标准算法
各位大哥,帮帮忙!!!

#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

#10


他规定的算法是Base64(MD5(srcDeviceId+userIdType+userId+spId+PIDType+PID+timeStamp+sp的sharekey))

#11


关键就是这个timeStamp!!!
这个绝对不可能是一个变化的时间!
你问问它这个timeStamp是什么意思

#12


timeStamp退订的时间
他加密这个字符串是为了—加密字符串,用于验证SP是否为合法的SP,以及防止参数被篡改

#13


引用 12 楼 nx350528980 的回复:
timeStamp退订的时间 
他加密这个字符串是为了—加密字符串,用于验证SP是否为合法的SP,以及防止参数被篡改


加密是加密,
MD5是摘要算法,不是加密算法!MD5的结果无法解密还原的!

#14


各位大哥————小弟跪求
谁有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编码

#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的标准算法
各位大哥,帮帮忙!!!

#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

#10


他规定的算法是Base64(MD5(srcDeviceId+userIdType+userId+spId+PIDType+PID+timeStamp+sp的sharekey))

#11


关键就是这个timeStamp!!!
这个绝对不可能是一个变化的时间!
你问问它这个timeStamp是什么意思

#12


timeStamp退订的时间
他加密这个字符串是为了—加密字符串,用于验证SP是否为合法的SP,以及防止参数被篡改

#13


引用 12 楼 nx350528980 的回复:
timeStamp退订的时间 
他加密这个字符串是为了—加密字符串,用于验证SP是否为合法的SP,以及防止参数被篡改


加密是加密,
MD5是摘要算法,不是加密算法!MD5的结果无法解密还原的!

#14


各位大哥————小弟跪求
谁有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编码