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 ; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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代理技术深度解析与实战指南