HMAC-SHA1の処理

解決


Quest  2010-07-23 02:07:19  No: 38850

javaで下記のようなコードがあるのですが
これをDelphi2010(またはDelphi2007)で書くにはどうすれば良いでしょうか。

private static String getSignature(String secretKey, String parameters) {
  SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), "HmacSHA1");
  Mac mac = Mac.getInstance("HmacSHA1");
  mac.init(signingKey);
  byte[] rawHmac = mac.doFinal(parameters.getBytes());
  return new String (Base64.encode(rawHmac));
}

Mac.getInstance("HmacSHA1");の部分は、DCPCryptというコンポを
落としてきたので、その中のDCP_sha1というコンポでいけると思いますが
SecretKeySpec(secretKey.getBytes(), "HmacSHA1");この部分をどうすればいいか判りません。
いろいろググッた結果、鍵文字列から秘密キーを生成するらしいですが
Delphiで何かこれに相当するコンポ(或いはWinAPI)はあるでしょうか。

Quest


はてな  2010-07-23 06:19:25  No: 38851

コードはどうでもいいとして、要はSHA-1の暗号鍵を生成したいの?


Quest  2010-07-23 19:25:57  No: 38852

はい、あるサイトにアクセスするときにパラメータのSignatureをつけなければならないのですが
SHA1の暗号鍵を生成しなければなりません。
やりたい事とほぼ同じ内容が、Amazon Web Serviceにアクセスする事で
違うのがアマゾンはHMAC-SHA256ですが、こちらはHMAC-SHA1だということです。
下記サイトを参考にしましたが、知識不足のため自力でSHA256をSHA1に替える
やり方がわかりませんでした。
http://weyk.air-nifty.com/none/2009/06/delphihmac-sha2.html


Quest  2010-07-24 07:40:19  No: 38853

結局下記サイトを参考にして、自力で実装できました。
http://www.ipa.go.jp/security/rfc/RFC2104JA.html
先に示したjavaのルーチンと同じものを返してきたので大丈夫だと思います。
因みに下記の様な感じです。
var
  digest: array[0..19] of Byte;
  k_ipad, k_opad: array [0..63] of byte;
  key: AnsiString;
begin
  key := 'キー文字列';
  FillChar(k_ipad, 64, 0);
  FillChar(k_opad, 64, 0);
    
  for ix := 1 to Length(key) do
  begin
    k_ipad[ix-1] := ord(key[ix]);
    k_opad[ix-1] := ord(key[ix]);
  end;
  for ix := 0 to 63 do
  begin
    k_ipad[ix] := k_ipad[ix] xor $36;
    k_opad[ix] := k_opad[ix] xor $5c;
  end;
    
  DCP_sha11.Init;
  DCP_sha11.Update(k_ipad, 64);
  DCP_sha11.UpdateStr("パラメータ文字列");
  DCP_sha11.Final(digest);
  DCP_sha11.Init;
  DCP_sha11.Update(k_opad, 64);
  DCP_sha11.Update(digest, 20);
  DCP_sha11.Final(digest);


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加