MD5 + Base64 加密

昨天做顺丰快递(丰桥API)的对接时,发现他们需要的签名是MD5+BASE64,而且需要转成UTF-8的编码。丰桥的例子是用JAVA做的,我尝试换成了DELPHI。并且有几种不同的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
uses EncdDecd, clEncoder, System.Hash, IdURI, IdGlobal, IdHashMessageDigest, HttpApp;
 
var
  md5:THashMD5;
  strText, strMD5, strVerifyCode : string;
  clEncoder1 : TclEncoder;
  idMD5: TIdHashMessageDigest5;
begin
  strText :='http://www.baidu.com/?要加密的字符串';
  mmo1.Lines.Add('第一种方式:DELPHI自带的Indy控件');
  strMD5 := TIdURI.URLEncode(UTF8Encode(strText));    //注意,这里使用Indy的控件,URLEncode后的编码与标准的编码有差别,其中http://的部分并没有被编码,所以后面采用了DELPHI的HttpApp单元的HttpEncode函数
  mmo1.Lines.Add('URLEcode后 : ' + strMD5);             //http://www.baidu.com/?%E8%A6%81%E5%8A%A0%E5%AF%86%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2
  strMD5 :=HttpEncode(UTF8EnCode(strText));
  mmo1.Lines.Add('URLEcode后 : ' + strMD5);             //http%3A%2F%2Fwww.baidu.com%2F%3F%E8%A6%81%E5%8A%A0%E5%AF%86%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2
  idMD5 := TIdHashMessageDigest5.Create;
  strVerifyCode := BytesToBase64(idMD5.HashString(strMD5, IndyTextEncoding(TEncoding.UTF8)));
  mmo1.Lines.Add('BASE64编码后 : ' + strVerifyCode);    //ODKmWW3nEB+4piM6RniSbw==
  mmo1.Lines.Add('');
  mmo1.Lines.Add('第二种方式:第三方控件, Clever Internet Suite');
  strMD5 := TclFormFieldEncoder.Encode(strText, 'UTF-8');
  mmo1.Lines.Add('URLEcode后 : ' + strMD5);             //http%3A%2F%2Fwww.baidu.com%2F%3F%E8%A6%81%E5%8A%A0%E5%AF%86%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2
  md5:=THashMD5.Create;
  md5.Update(strMD5);
  mmo1.Lines.Add('MD5编码后 : ' + md5.HashAsString);    //3832a6596de7101fb8a6233a4678926f
  clEncoder1 :=TclEncoder.Create(nil);
  clEncoder1.EncodeMethod :=cmBase64;
  clEncoder1.CharSet :='UTF-8';
  strVerifyCode := clEncoder1.EncodeToString(md5.HashAsBytes, cmBase64);
  mmo1.Lines.Add('BASE64编码后 : ' + strVerifyCode);    //ODKmWW3nEB+4piM6RniSbw== 

  

其中:BytesToBase64的函数定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function StreamToBase64(AStream: TStream): AnsiString;
var
  objSS: TStringStream;
begin
  objSS := TStringStream.Create('');
  try
    EncodeStream(AStream, objSS); // Delphi7 自带unit EncdDecd的方法
    Result := objSS.DataString;
  finally
    FreeAndNil(objSS);
  end;
end;
 
function BytesToBase64(const bytes: ARRAY OF Byte): AnsiString;    // TByteArray
var
  memoryStream: TMemoryStream;
begin
  memoryStream := TMemoryStream.Create;
  memoryStream.WriteBuffer(bytes[0], Length(bytes));
  memoryStream.Seek(0, soFromBeginning);
  Result := StreamToBase64(memoryStream);
  memoryStream.Free;
end;

  

posted on   西点肥牛  阅读(444)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示