DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: kebingoo
今日帖子: 4
在线用户: 4
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 yangyachao (常安宁) ▲▲△△△ -
普通会员
2022/8/8 16:54:15
标题:
请教一下这个java签名用delphi怎么写 浏览:1028
加入我的收藏
楼主: 签名核心逻辑为,先将签名数据装换为十六进制,再将转换后的数据进行MD5签名,最后将签名后的数据进行base64加密,加密后得到的数据就是签名值。
// 十六进制数
String HEXADECIMAL = "0123456789ABCDEF";
   // utf-8编码
   String UTF_8 = "utf-8";
   // 待签名内容
   String content = "{\"result\":{\"sign_type\":\"md5\",\"sign\":\"\",\"code\":\"10000\",\"msg\":\"接口调用成功,并且业务系统也处理成功\"},\"body\":\"B06yK+h55/LYcgcjeanAn8aLV28ALqOa0IhUpNq2X9I=\"}";
   // 将待签名内容转换成十六进制
   char[] chars = HEXADECIMAL.toCharArray();
   byte[] con = content.getBytes(UTF_8);
   StringBuffer sb = new StringBuffer();
   int bit;
   for (int i = 0 ; i < con.length; i++) {
      bit = (con[i] & 0x0f0) >> 4;
      sb.append(chars[bit]);
      bit = con[i] & 0x0f;
      sb.append(chars[bit]);
   }
// 转换十六进制后的待签名内容
content = sb.toString();
// MD5签名
   MD5Digest md5Digest = new MD5Digest();
// 将链接变量重置为IV值
   md5Digest.reset();
   md5Digest.update(content.getBytes(charset), 0, content.length());
   byte[] resByte = new byte[16];
   md5Digest.doFinal(resByte, 0);
   // 将签名用base64加密,res即为最终的签名结果
   res = new String(Base64.getEncoder().encode(resByte), charset);
原始数据:
{"result":{"sign_type":"md5","sign":"","code":"10000","msg":"接口调用成功,并且业务系统也处理成功"},"body":"B06yK+h55/LYcgcjeanAn8aLV28ALqOa0IhUpNq2X9I="}
签名值:
OZvtIRl1XxcyXGWbwyItVg==
----------------------------------------------
-
作者:
男 sczhyq (旺财) ★☆☆☆☆ -
普通会员
2022/8/8 18:50:38
1楼: #include <System.Hash.hpp>
#include <System.NetEncoding.hpp>

先将签名内容 content 连接好
TBytes B = THashMD5::GetHashBytes(content);
签名值 = TNetEncoding::Base64->EncodeBytesToString(&B[0], B.High);
----------------------------------------------
我84砖家
作者:
男 yangyachao (常安宁) ▲▲△△△ -
普通会员
2022/8/9 8:38:28
2楼: 谢谢大佬给的思路,搞出来了
function BytesToHex(Data: TBytes): AnsiString;
const
  Digits: array[0..15] of AnsiChar = ('0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
var
  I, Len: Integer;
  B: Byte;
  Buffer: PAnsiChar;
begin
  Result := '';
  Len := Length(Data);
  if Len = 0 then
    Exit;

  Buffer := @Data[0];
  for I := 0 to Len - 1 do
  begin
    B := PByte(Integer(Buffer) + I)^;
    Result := Result + {$IFDEF UNICODE}string{$ENDIF}
      (Digits[(B shr 4) and $0F] + Digits[B and $0F]);
  end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
 var content := '{"result":{"sign_type":"md5","sign":"","code":"10000","msg":"接口调用成功,并且业务系统也处理成功"},"body":"B06yK+h55/LYcgcjeanAn8aLV28ALqOa0IhUpNq2X9I="}';
 var md5 := THashMD5.Create;
 var B := md5.GetHashBytes(BytesToHex(TEncoding.UTF8.GetBytes(content)));
 var res := TNetEncoding.Base64.EncodeBytesToString(@B[0], length(b));
 showmessage(res);
end;
----------------------------------------------
-
作者:
男 sczhyq (旺财) ★☆☆☆☆ -
普通会员
2022/8/10 15:26:54
3楼: 提醒一下

TNetEncoding.Base64.EncodeBytesToString(@B[0], length(b));

TNetEncoding.Base64.EncodeBytesToString(@B[0], High(b));

结果是不一样的
----------------------------------------------
我84砖家
作者:
男 yangyachao (常安宁) ▲▲△△△ -
普通会员
2022/8/10 16:16:53
4楼: 谢谢大哥提醒,high是最大下标嘛,length是长度嘛,我测了一下这里用length跟java对的上
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行68.35938毫秒 RSS