昨天做顺丰快递(丰桥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;

  

MD5 + Base64 加密的更多相关文章

  1. iOS HmacSHA1加密 和 MD5 Base64加密 --iOS开发系列---项目中成长的知识五

    项目中开发中需要对一些数据进行加密后和服务器验证是否是我们客户端发出的请求! 方案是服务器定的,使用HmacSHA1加密和MD5 Base64加密 加密过程比较复杂 1.获取格林威治时间 2.用bas ...

  2. iOS中的MD5(base64)加密

    MD5(base64)是一种结合MD5摘要和base64编码的密文处理方式,加密后的结果为24位字符串,且后两位为==,例如:1的加密结果为xMpCOKC5I4INzFCab3WEmw==. 下面是加 ...

  3. md5,base64加密

    import java.security.MessageDigest; import org.apache.commons.codec.binary.Base64;import org.apache. ...

  4. Oracle中MD5+Base64加密实现

    JAVA实现: public static String getMD5(String str) throws Exception {   MessageDigest md5 = MessageDige ...

  5. Js中 md5 sha1 base64 加密

    js的3中加密方式: .sha1加密,加密性高 调用: var sha = hex_sha1(str); .base64加密 调用: var b = new Base64(); var str = b ...

  6. MD5加密,Base64加密/解密,AES加密/解密

    1.从github上下载GTMBase64-master和AESCrypt-ObjC-master导入工程,如下图所示. 2.使用前的配置及注意事项: (1) 在build phases中的GTMBa ...

  7. C# 加密解密(DES,3DES,MD5,Base64) 类

    public sealed class EncryptUtils     {         #region Base64加密解密         /// <summary>        ...

  8. Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结

    (1)commons-codec包简介 包含一些通用的编码解码算法.包括一些语音编码器,Hex,Base64.MD5 一.md5.base64.commons-codec包 commons-codec ...

  9. Linux下使用MD5加密BASE64加密

    这里以字符串123456为例子,它的md5密文值为:e10adc3949ba59abbe56e057f20f883e 这里以1.txt为需要被加密的文件. 一. 用oppnssl md5 加密字符串和 ...

  10. js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结

    写前端的时候,很多的时候是避免不了注册这一关的,但是一般的注册是没有任何的难度的,无非就是一些简单的获取用户输入的数据,然后进行简单的校验以后调用接口,将数据发送到后端,完成一个简单的注册的流程,那么 ...

随机推荐

  1. 开发AR导航助手:ARKit+Unity+Mapbox全流程实战教程

    引言 在增强现实技术飞速发展的今天,AR导航应用正逐步改变人们的出行方式.本文将手把手教你使用Unity+ARKit+Mapbox开发跨平台AR导航助手,实现从虚拟路径叠加到空间感知的完整技术闭环.通 ...

  2. JuiceFS 企业版 5.2:迈入千亿文件时代,稳定性与性能再升级,首次支持 Windows 客户端

    JuiceFS 企业版 5.2 版本近日发布,文件管理规模迈入千亿级.此次升级重点提升了超大规模集群的稳定性,优化了分布式缓存的网络性能,并增强了系统的易用性与安全性,旨在支持高并发访问等复杂的高性能 ...

  3. JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

    摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏. 引言   线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM.今天我们来一起学习 ...

  4. python播放mp3最佳方法

    使用playsound库 1 from playsound import playsound 2 3 playsound('xx.mp3') 音质很好,就是只能播放mp3

  5. 【译】Cloud Academy(云学院):解锁您的 Azure 技能,加速职业发展

    当我们在2025年3月为 Visual Studio 专业版和企业版用户推出云学院福利时,我们的目标很简单:为您提供所需的实践操作学习体验,让您能够自信地掌握 Azure 和云技术,且除了订阅费用外无 ...

  6. 鸿蒙运动项目开发:封装超级好用的 RCP 网络库(上)—— 请求参数封装,类型转化器与日志记录篇

    鸿蒙核心技术##运动开发## Remote Communication Kit(远场通信服务) 在鸿蒙运动项目开发中,网络通信是不可或缺的一部分.无论是获取运动数据.同步用户信息,还是加载运动视频资源 ...

  7. Cloud Run Job(google作业) 处理耗时任务

    最近使用google cloud的一些服务处理一些事,使用了Cloud Scheduler定时发送http请求大Cloud Function,让Cloud Function定时处理我的事.这个时候会有 ...

  8. go-zero使用

    官网文档地址: https://go-zero.dev/docs/tasks 这是一个脚手架,用于把proto文件或者api文件转为服务代码. 环境安装分4步(官网文档上有写): 1.安装golang ...

  9. Kong入门学习实践(8)流量控制插件

    Kong的一大特色就在于强大的可扩展性,具体实现方式就是插件.一来Kong已经提供了很多内置的插件,二来我们也可以使用Lua语言自定义开发插件.今天,我们就来了解一些常用的流量控制插件. 关于流量控制 ...

  10. 【深入理解 volatile】内存可见性与同步机制详解

    1. 引言 在多线程编程中,共享变量的可见性和同步问题一直是开发者面临的挑战.Java 提供了 volatile 关键字来确保变量的可见性和有序性,但它并不保证原子性.本文将深入探讨 volatile ...