• 支付宝签名验证实现-Delphi版


    支付宝签名验证实现-Delphi版

    首先介结下支付宝签名验证流程:

     支付宝密钥生成

    支付宝提供秘钥生成工具https://docs.open.alipay.com/291/105971/

    用此下载此工具,生成相关RSA密钥.

     

    官网提供的PKCS8 PKCS1 如果不是JAVA的请用PKCS1

     

         如果已经用了PKCS8,Delphi要如何用呢?官网的工具也提供了转换工具

     

    那么这串就是其它要用到的密钥.

    打开密钥文件路径:就可以看到其它语言专用的密钥。长度10242048多行.

    打开密钥文件:

    其标准格式如上:我们可以看出其格式,头尾多以----注释---包围,很重要,这个是标明此密钥的格式。

     支付宝签名过程https://docs.open.alipay.com/291/106118

     

     前面的多不难,很多人死在这一部。因为Delphi没有提供标准库证书算法.

    Delpi如何实现:

     我们去看DELPHI Indy得知要实现这一功能需要引用

    在各自的不同平台多有其对应的库.

    DELPHI indy也实现了对这些功能的扩展,其单元 IdSSLOpenSSLHeaders

    此单元是indylibeay32库扩展的PAS 里面实现了对接

       

    1. Libery32.dll用什么版本号.其实Delphi自代libery32.dll的我直接用自代的,最好用新版本会比较稳托.

    我的开发环境是10.2.1DELPHI所要的DLL目录如下

     

    在其安装目录下就自代这货了。。MSVCP100高版本的DLL需要这个配合使用,不然会提示少MSVCP100.DLL

           把相关DLL直接COPYEXE所在目录即可

           有的低版本delphi其自代的DLL版本太低,或其DLL和现有的DELPHI IDDSLL单元不匹配.因此很多人重写了

           Libery32.pas对接libery32.dll 这样在什么样的版本DELPHI 多可以适用。而且DELPHI自代的有的没有把LIBER32.DLL功能实现,

           经过多方查找,终于找到一个重写libery32.pas写的比较好的库,这个很重要,真的很重要。

           本人SVN地址:

               https://115.159.70.108:8443/svn/Super/OpenSSL

               账号:read

               密码:read

           请自行下载

    1. 签名实现代码如下

     

     

     

     

     

     

     

     

     

     

     

     

    program mysign;

    {$APPTYPE CONSOLE}

    {$R *.res}

    uses

      System.SysUtils,

      ssl_evp,

      ssl_bio,

      ssl_err,

      ssl_const,

      ssl_types,

      ssl_pem,

      ssl_engine,

      ssl_x509;

    var

      certFile: AnsiString;

      PrivKey: AnsiString;

      signFile: AnsiString;

      Path: AnsiString;

      pkey: PEVP_PKEY;

      bp, mbp: PBIO;

      md_ctx: EVP_MD_CTX;

      Buf: AnsiString;

      Len: Integer;

      SigBuf: Array [0..4095] of AnsiChar;

      SigLen: Integer;

      InBuf: Array[0..511] of AnsiChar;

      _x509: PX509;

      b64: PBIO;

      a, i : Integer;

    begin

      try

        { TODO -oUser -cConsole Main : Insert code here }

        Writeln('DEMO: mysign');

        //初始化工作

        SSL_InitPEM;

        SSL_InitERR;

        SSL_InitBIO;

        SSL_InitEVP;

        SSL_InitENGINE;

        SSL_InitX509;

        ENGINE_load_builtin_engines;

        OpenSSL_add_all_ciphers;

    OpenSSL_add_all_digests;

        Path := ExtractFilePath(ParamStr(0));

        //支付宝生成的密钥文件加载进来

        PrivKey := Path + 'private.pem';

        //sha1withRSA 签名后得到的保存地址

        signFile := Path+'sign.pem';

        if (not FileExists(PrivKey)) then

         raise Exception.Create('PrivKey密钥文件不存在');

        //签名      sign_type=RSA2 RSA

        Buf := 'app_id=11111111&biz_content={"out_trade_no":"2017090517245110464476"}'+

               '&charset=UTF-8&format=JSON&method=alipay.trade.query&sign_type=RSA2&timestamp=2017-09-26 15:16:25&version=1.0';

        //如果用UTF-8UTF8编码

    Buf := UTF8Encode(Buf);

        Len := Length(Buf);

        Writeln('Sign test phrase: '+Buf);

    { Sign }

        bp := BIO_new_file(PAnsiChar(PrivKey), 'r');

        SSL_CheckError;

        try

         pkey := PEM_read_bio_PrivateKey(bp, nil, nil, nil);

         SSL_CheckError;

        finally

          BIO_free(bp);

        end;

        //如果是RSA2EVP_sha256 如果用RSAEVP_sha1

        EVP_SignInit(@md_ctx, EVP_sha256);

        SSL_CheckError;

        EVP_SignUpdate(@md_ctx, PAnsiChar(buf), len);

        SSL_CheckError;

        EVP_SignFinal(@md_ctx, @SigBuf, SigLen, pkey);

        SSL_CheckError;

        Writeln('Sign size ', SigLen, ' bytes');

        EVP_PKEY_free(pkey);

        bp := BIO_new_file(PAnsiChar(signFile), 'w');

        b64 := BIO_new(BIO_f_base64);

        mbp := BIO_push(b64, bp);

        BIO_write(mbp, @SigBuf, SigLen);

        BIO_flush(mbp);

        Writeln('Bytes written ', BIO_number_written(bp), ' file ', signFile);

        BIO_free_all(mbp);

    { End sign }

      except

        on E: Exception do

          Writeln(E.ClassName, ': ', E.Message);

      end;

    end.      

    好了,东东不多,但研究时是另一回事,本人也是研究了三天才得出的结果,最后签名和支付宝签名工具一至。。。哇哈哈。

    联系QQ:378464060 叫兽叔叔

  • 相关阅读:
    [题解?]luogu_P1415拆分数列(dp(不懂
    [题解]luogu_P1070道路游戏(堆dp
    [题解]luogu_P2577午餐(贪心dp
    [题解]luogu_P2157学校食堂(状压dp
    [模板]线段树合并
    [题解]宝藏(状压
    [题解]NOI2010超级钢琴
    [题解]luogu_P2161_会场预约(线段树颜色相关
    【总结】LCA的4种求法
    SRM517-600加强版(DP)
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/7616692.html
Copyright © 2020-2023  润新知