RAD Studio 10.2 Hash新功能

Posted by on in Blogs

最近也许是电子支付很热门, 因此看到很多使用SHAMD5加密的应用, 刚好10.2版在这方面也提供了一些新功能, 就让我们讨论一下.

10.2版之前System.Hash程序单元中的THashMD5THashSHA1/THashSHA2等类别都提供了下面形式的GetHashString函式提供字符串加密的功能:

    class function GetHashString(const AString: string): string; overload; static; inline;

由于GetHashString函式接受字符串参数, 因此我们可以使用下面的程序代码来加密字符串:

procedure TForm3.Button1Click(Sender: TObject);

var

  sEncryptData : String;

  sResult : String;

  aHashBytes : TBytes;

  sData : String;

begin

  sEncryptData := MerchantKey + MerchantCode + RefNo + Amount + Currency;

  sData := TEnCoding.UTF8.GetString(BytesOf(sEncryptData) );

  aHashBytes := THashSHA1.GetHashBytes(sData);

  sResult := TNetEncoding.Base64.EncodeBytesToString(aHashBytes);

  Memo1.Lines.Add(sResult);

end;

这虽然没有问题, 但如果有大量的宇串要先运算, 处理再加密的话, 这样比较没有效率.

因此在10.2版中有了新的GetHashString函式, 它直接接受TStream形态的参数:

    class function GetHashString(const AStream: TStream): string; overload; static; inline;

因此我们可以直接使用TStringBuilder对象来进行大量的宇串运算, 处理最后再加密:

procedure TForm3.Button2Click(Sender: TObject);

var

  sb: TStringBuilder;

  ss : TStringStream;

  sResult : String;

  aHashBytes : TBytes;

begin

  sb := TStringBuilder.Create;

  try

    sb.Append(MerchantKey);

    sb.Append(MerchantCode);

    sb.Append(RefNo);

    sb.Append(Amount);

    sb.Append(Currency);

    ss := TStringStream.Create(sb.ToString, TEnCoding.UTF8);

    aHashBytes := THashSHA1.GetHashBytes(ss);

    sResult := TNetEncoding.Base64.EncodeBytesToString(aHashBytes);

    Memo1.Lines.Add(sResult);

  finally

    sb.free;

    ss.free;

  end;

end;

 

这样的用法结果和上面的方式一样, 但执行效率会比较好:

 

THashMD5THashSHA1/THashSHA2等类别都提供了新的GetHashString函式可让程序员使用.



Comments

Check out more tips and tricks in this development video: