MD5 + Base64 加密

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

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的函数定义如下:

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 2021-12-13 11:50  西点肥牛  阅读(479)  评论(0)    收藏  举报

导航