MD5 与 SHA 在 Delphi 中函数实现,加密密码

时间:2023-03-08 17:14:14
MD5 与 SHA 在 Delphi 中函数实现,加密密码

MD5 与 SHA 在 Delphi 中函数实现。

为了加密密码,必须使用一种算法,查询资料,比较好的方法是使用:MD5等算法,参考:Delphi XE8 支持MD5

第一种方式是:引用 System.Hash 中的 THashMD5, (或者 THashSHA1,THashSHA2) 参考 官方文档。

http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Hash

简单用法:  hashmd5 := THashMD5.Create.GetHashString('abc');         ‘abc’ 是你想加密的字符串,你提供。

使用它计算的结果中,字符是小写。MD5 ("abc") =   900150983cd24fb0d6963f7d28e17f72

另一种加密是:    hashsha1 := THashSHA1.Create.GetHashString('abc');

====================== 
加“盐”加密: THashMD5.Create.GetHMAC('abc','salt');
可以将用户名作为 salt,对密码进行MD5加密,或者THashSHA1,THashSHA2加密。

THashSHA1/2.Create.GetHMAC(const AData, AKey: string) : string;

http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Hash.THashMD5.GetHMAC

第二种方式是:使用  IdHashMessageDigest  ,产生的加密字符是:大写格式

比如:加密 ‘abc ’   MD5 ("abc") = 900150983CD24FB0D6963F7D28E17F72 

在单元中,引入Uses  IdHashMessageDigest,(也可以包括:,IdHash,IdGlobal, 不知道原因 !)

代码如下:

Uses  IdHashMessageDigest;

function MD5Encode(const str:string):String;     //定义一个公开函数

function MD5Encode(const str:string):String;
var
    //引用 IdHashMessageDigest,IdHash,IdGlobal 空间
    AMD5Encode:TIdHashMessageDigest5;
begin
    AMD5Encode:=TIdHashMessageDigest5.Create;            //创建实例

try
        Result  :=  AMD5Encode.HashStringAsHex(str);      //这是实现!

finally
        AMD5Encode.Free;
    end;
end;

============================================================

由于代码迁移到 Net 框架,需要相应 的C# 的代码实现,继续补充相应资料。

寻求:delphi 中   System.Hash 中的 THashMD5, (或者 THashSHA1,THashSHA2)的C# 资料

参考:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.hmacmd5?view=netframework-4.6

来自   System.Security.Cryptography

程序集:  System.Security.Cryptography.Algorithms.dll, mscorlib.dll, netstandard.dll

如下代码产生相同的 Hash结果:

using System.Security.Cryptography;    //增加引用

string logUser;              //  代码登录的用户名称

      //HMACMD5(Byte[])  初始化时,采用了用户的名称       public HMACMD5 (byte[] key) 定义;

   HMACMD5 provider = new HMACMD5(Encoding.UTF8.GetBytes(loguser));

     // 加密用户的录入的密码 LogPass
   byte[] hashedPassword = provider.ComputeHash(Encoding.UTF8.GetBytes(LogPass));

   //将字节数组转换成 字符串,“X2” 是大写,可以使用 “x2” 转成小写 。
   StringBuilder displayString = new StringBuilder();
   for (int i = 0; i < hashedPassword.Length; i++)
   {
       displayString.Append(hashedPassword[i].ToString("X2"));
   }