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;
浙公网安备 33010602011771号