Perlモジュールを使わずにsha256変換を実行する方法

このQ&Aのポイント
  • 質問者は、PerlでHMAC-SHA256の変換を行い、結果をBASE64エンコードしたいと考えています。
  • 質問者には新しいPerlモジュールをインストールする権限がないため、Perlの式を使用して変換を行いたいと思っています。
  • 質問者は、PerlのままでHMAC-SHA256変換を実行する方法を知りたいとしています。
回答を見る
  • ベストアンサー

Perlモジュールを使わずにsha256変換を使う方法

下記のPHPと同じ結果をPerlで出したいです。 ■PHPデータ <?php // HMAC-SHA256 $hash = hash_hmac('sha256', hogedata, hogekey, 'true'); // BASE64エンコード print base64_encode($hash); ?> 検索エンジンで調べたところ、 「Digest::SHA256」などのPerlモジュールを使用すれば可能なようですが、 新しいPerlモジュールをインストールする権限のないため、 直接、Perlに式を記述したいと思いました。 ■Perlデータ(途中) #!/usr/bin/perl use MIME::Base64; print "Content-type: text/html\n\n"; # HMAC-SHA256 ~ここに変換式が入ります~ # BASE64エンコード $enhash = encode_base64($hash); print "$enhash"; PHPで書き直せば同じサイトを作ることは可能ですが、 できればPerlのままで継続したいです。 お分かりの方がいらっしゃいましたら、 ご教授いただけますでしょうか。 どうぞよろしくお願いいたします。

  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

Digest::SHA256 は、C で書かれた部分があるので難しいですが、Perl だ けで書かれた Digest::SHA::PurePerl であれば、CGI を設置したディレク トリに例えば mycpan/Digest/SHA というディレクトリを作り、そこに http://cpansearch.perl.org/src/MSHELOR/Digest-SHA-PurePerl-5.47/lib/Digest/SHA/PurePerl.pm をコピーすればよいです。 使う時は use lib qw( mycpan ); use Digest::SHA::PurePerl; で設置したものを使用します。

参考URL:
http://search.cpan.org/~mshelor/Digest-SHA-PurePerl-5.47/
kuzumiHK
質問者

お礼

ご回答ありがとうございます。 ようやくPHPと同じ結果がでました。 #!/usr/bin/perl use lib qw(../mycpan); use Digest::SHA::PurePerl qw(hmac_sha256_base64); print "Content-type: text/html\n\n"; # HMAC-SHA256 $hash = hmac_sha256_base64(hogedata, hogekey); print "$hash\="; exit 0; 普通のFTPでCPANをアップするという発想自体がありませんでした。 ※テストしてみたところ最後に=(半角のイコール)がなかったため、 文字列として追加しました。 これでなんとかなりそうです。ありがとうございました!

その他の回答 (1)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

> 新しいPerlモジュールをインストールする権限のないため、 CPAN モジュールはユーザ領域にもインストールできます。 システムに入っていなかったり、システムに用意されているものより 新しいバージョンのものを使いたかったりする場合は、自分用に ユーザ領域にインストールすればよいです。 下記のウェブページは参考にならないでしょうか。 http://iandeth.dyndns.org/mt/ian/archives/000623.html

kuzumiHK
質問者

お礼

ご回答ありがとうございます。 現在利用させてもらっているサーバは、 セキュリティの観点からTelnetもSSHも不可とのことでした。 ユーザ領域にインストールできるとは思っていませんでした。 Telnetが可能であれば簡単なコマンドは打てるのでよかったのですが。 やはりPHPで書き直すか契約変更しかないでしょうか。。 もう少し情報を待ってみたいと思います。 情報ありがとうございます。助かります。

関連するQ&A

  • PHPのSHA256変換について

    C#で以下のロジックがあるのですが、 using System.Text; using System.Security.Cryptography; private static string getHash(string data, string salt, int stretchingcount, Encoding encode) {     int m = salt.Length / 2;     string tmp = salt.Substring(0, m) + data + salt.Substring(m);     byte[] buf = encode.GetBytes(tmp);     SHA256CryptoServiceProvider algorithm = new SHA256CryptoServiceProvider();     for (int i = 0; i < stretchingcount; ++i)     {         buf = algorithm.ComputeHash(buf);     }     return BitConverter.ToString(buf).Replace("-", string.Empty); } こちらのソースをPHPで同じ結果になるように実装したいのですが、 同じ結果にならず、困っています。 PHP側のソースは以下の通りです。 public static function funcPrivacyCheck($data,$salt,$stretchingcount){ $m = strlen($salt) / 2; $tmp = substr($salt,0,$m).$id.substr($salt,$m); $tmp = base64_encode(utf8_encode($tmp)); $hash = ''; for ($i = 0; $i < $stretchingcount; $i++) { if($hash <> ''){ $hash = hash_hmac('sha256' ,$hash, false); }else{ $hash = hash_hmac('sha256' ,$tmp, false); } } return $hash; } エンコードは、UTF-8を指定することが前提です。 ご教授頂きますようよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • HMAC-SHA1ハッシュ関数について

    HMAC-SHA1ハッシュ関数について質問です。 HMAC-SHA1 によってダイジェスト値を生成し、BASE64 でエンコードすることによってシグニチャを生成したいと考えました。 参考サイト http://weboo-returns.com/blog/php-oauth-consumer-request-2-legged-oauth/ 上記の例では、 ●ダイジェスト値 GET&http%3A%2F%2Fapi.gu3.jp%2Fv1%2Ftest%2Fauth&oauth_consumer_key%3Dyamashita.dyndns.org%26oauth_nonce%3Dc83b1847200bd25d918c3fb077aca16f%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1219931263%26oauth_version%3D1.0 ●共有キー kd94hf93k423kf44& とした場合、ここから得られる、シグニチャは以下のようになりますと書かれています。 M32qYtcaUD8b1Kb/AponRG5hrwI= 上記を下記のPHPで試してみました。 ********************************************* <?php $key2 = 'kd94hf93k423kf44&'; $Base_String2 = 'GET&http%3A%2F%2Fapi.gu3.jp%2Fv1%2Ftest%2Fauth&oauth_consumer_key%3Dyamashita.dyndns.org%26oauth_nonce%3Dc83b1847200bd25d918c3fb077aca16f%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1219931263%26oauth_version%3D1.0'; $OAuthSignature2 = base64_encode(hash_hmac('sha1', $Base_String2, $key2, true)); echo $OAuthSignature2."\n"; ?> ************************************** ここから得られたシグニチャは以下のようになりました。 /j6JriS6FRFbKat4X3pJg4hO1Po= 残念ながら例示であるM32qYtcaUD8b1Kb/AponRG5hrwI=と一致しません。 私のPHPの書き方に誤りがあるようです。 質問 HMAC-SHA1 によってダイジェスト値を生成し、BASE64 でエンコードすることによってシグニチャを生成するPHPはどのように書けばよいのでしょうか?

    • ベストアンサー
    • PHP
  • PHPとJavaでSHA256の結果を同じにしたい

    PHPから JavaServletにアクセスするシステムを作っています。 その際にパラメーターの改ざん対策にハッシュを渡すようにしたいのですが PHPでSHA-256でハッシュ化した値と JavaでSHA-256でハッシュかした値が異なってしまいます。 PHPだとハッシュ化する際の秘密鍵を指定する項目がありますが Javaでは見つかりませんでしたので この項目が違うために結果が違うのだと予想していますが Javaが内部的に使っている秘密鍵はどこか取得できるのでしょうか? やりたいこととしてはPHPとJavaで同じハッシュが取得できるようにしたいのですが 良い案とかやり方あったら教えてください。 ◆php string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] ) ◆Java DigestUtils.sha256Hex(string data) わかる方いましたら教えてください。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Perl+UTF8で文字化け

    以下の環境にてメール送信プログラムを作成していますが、 ありがちな文字化け、且、ボディーが表示されない不具合が発生しています。 サーバ:linux apache レンタルサーバ ※Encode.pm、Jcode.pm無し。モジュールインストール不可。 Perl version: 5.006001 ソースエンコード:utf-8 自分の解釈としてはutf8で記述しているので、 charset=utf-8にしておけば、 MIMEエンコードさえしてやれば 表示できると考えているのですが、 やはり甘い考えなのでしょうか? また、同サイト質問NO2868794も参考にさせていただきましたが、上手くいきません。 以下ソース(エンコード:utf-8) use utf8; use MIME::Base64; use POSIX; ※アドレス表記はこのサイトの投稿チェックに引っかかるので省略します。 my $to = 'XXXX@XXXX'.XXX; my $from_nm = "送信者名"; my $from_adr = "XXXXX@XXX.XXX"; my $subject = "メール表題"; my $body = "本文"; # 送信者名を MIME エンコード encode_base64($from_nm,""); # subjectを MIME エンコード encode_base64($subject,""); $subject = "=?utf-8?B?" . $subject . "?="; # 本文を MIME エンコード encode_base64($body); my $MailPass = "XXXX/XXXX/XXX"; #SendMail Pass open(MAIL,"| $MailPass -t"); #======================================================== print MAIL <<"EOF_MAIL"; From: $from_nm<$from_adr> To: $to Subject: $subject Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 MIME-Version: 1.0 $body EOF_MAIL #======================================================== close MAIL; その他、色々ググっては見たのですが、自分ではみつけられず、 どうかアドバイスありましたらよろしくお願いいたします。

  • perlのMIMEモジュールの代用ができるスクリプトは?

    CGIでメール受信処理をするために、Net::POP3の使用はできましたが、MIME系のモジュールがサーバーに用意されていないらしく、受信したメールの解析がうまくいきません。 モジュールなので、サーバーのPERLに管理者が追加しないといけないと思うのですが、お願いしても断られてしまいました。 jcode.plやcgi-lib.plのように、requireで読み込むようなパターンにしようと思うのですが、代用できるようなスクリプトをご存知の方はいらっしゃらないでしょうか? MIME-Base64 MIME-tools MailTools IO-stringy の四点に変わるものを探しています。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • Perlのデータ構造について

    Perlのデータ構造でわからないところがあります。 ハッシュの配列で、以下の構造がある場合 my %hash_array = ( 1=>["aaa", "bbb"], 2=>["ccc", "ddd", "eee"], 3=>[], 4=>["fff"] ); print $hash_array{1}[0]; # aaaが表示される。 print $hash_array{2}[2]; # eeeが表示される。 ですが、 $hash_array{1}は 2 $hash_array{2}は 3 $hash_array{3}は 0 $hash_array{4}は 1 のように個数を表示させるのは、どうすればよいでしょうか? Perlのデータ構造に詳しいサイトや書籍はありますか? また、Perl 5.6.1から Perl 5.8.7に乗りかえようとしていますが、 データ構造など大幅に変わった点はあるのでしょうか?

    • ベストアンサー
    • Perl
  • PHPとjavascriptで共通なエンコード方法

    PHPからjavascriptにバイナリデータ(16バイト程度)を受け渡す 処理を作成しているのですが、うまく動作しないので、相談します。 バイナリデータをエンコードしてPHPからjavascriptに 以下の流れで引き渡しています。 (1)PHPのbase64_encodeでバイナリデータをエンコード (2)エンコードしたデータをjavascriptに出力 (3)javascriptでデータをデコード (3)のデコードには次のページのbase64.jsなど、いくつかの デコード方法を試してみました。 http://www.onicos.com/staff/iz/amuse/javascript/expert/ しかしながら(1)の元のデータと(3)でデコードしたデータが 一致しません。 質問したいのは以下の2点です。 ・PHPのbase64_encodeとjavascriptのbase64エンコードは  一般的に方式が違うのでしょうか。同じbase64なので  同じコードが生成されると考えたのですが、そうでは  ないのでしょうか。 ・base64_encodeでも、その他の方法でもかまわないので  PHPとjavascriptで共通なエンコード方式、あるいは  PHP上のバイナリデータをjavascriptに正しく受け渡す  方法があれば教えて下さい。 よろしくお願いします。

  • ファンゲートの作り方を教えてください

    Facebookページに付けるファンゲートの簡単な作り方を教えてくださいませんか。 これを入れればいいらしいですが、なかなかうまく行きません。 <?php 02 function parse_signed_request($signed_request, $secret) { 03 list($encoded_sig, $payload) = explode('.', $signed_request, 2); 04 // decode the data 05 $sig = base64_url_decode($encoded_sig); 06 $data = json_decode(base64_url_decode($payload), true); 07 if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { 08 error_log('Unknown algorithm. Expected HMAC-SHA256'); 09 return null; 10 } 11 // check sig 12 $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); 13 if ($sig !== $expected_sig) { 14 error_log('Bad Signed JSON signature!'); 15 return null; 16 } 17 return $data; 18 } 19 function base64_url_decode($input) { 20 return base64_decode(strtr($input, '-_', '+/')); 21 } 22 ?>

  • cgiメールの文字変換がうまくできない

    CGIメールです。 元々shiftjisなので、これをiso-2022-jpに変換させようとしてます。 $charset = "iso-2022-jp"; open(MAIL,"| $sendmail -t") || &error("失敗"); print MAIL "To: <$to>\n"; print MAIL "From: <$from>\n"; &jis("タイトル"); &base64("$msg"); print MAIL "Subject: $str\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=$charset\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; foreach ( split(/\n/, $body) ) { &jis("$_"); print MAIL $_, "\n"; } close(MAIL); sub jis{ $msg = $_[0]; Encode::from_to($msg, "shiftjis", $charset); ####1#### } sub base64 { use MIME::Base64; $str = $_[0]; if($str =~ /[^!-~\s]/){ $str = encode_base64($str, ""); if($charset eq "utf8"){ $str = '=?utf-8?B?' . $str . '?='; }else{ $str = '=?iso-2022-jp?B?' . $str . '?='; } } } このようにしてみたのですが、タイトル部分はきちんと表示されるのですが、ボディー部分が文字化けしてしまいます。(メーラーで手動にてshit-jisにエンコードしたらボディー部分が読めタイトル部分は文字化けする) Encode::from_to($msg, "shiftjis", $charset); の$charsetを"$charset"にしても同じ現象です また、元々参考にしたものでは####1####に retern $msg; があったのですが、これを入れるとsyntax errorになったので、これをコメントアウトしたらエラーにはならず送信そのものはできました ただ目的の文字変換ができないのですが、どこをどう改善すればいいでしょうか。 どうかご存じの方ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl連想配列の使い方について

    はじめまして。 現在、業務で他人の書いたコード(Perl)を改造しているのですが、その作成者がいなくなってしまっております。 そのコードを見ると、なぜ、このような書き方が可能なのか、理解できないので、動作原理を教えていただけないでしょうか? 以下のようなコードです。 ==================================== my @arr = ( "一" , "ニ" , "三" , "四" ) ; my %data ; $data->{0} = \@arr ; $data{0}{test} = "テスト" ; print ${$data->{0}}[1] . "\n" ; print $data{0}{test} . "\n" ; ==================================== 出力はこのようになります。 ニ テスト ここからが質問なのですが、$data->{0}という書き方ができる理由が分からないのです。 $dataが例えば、 my %my_hash ; my $data = \%my_hash ; というように、ハッシュのリファレンスであるならば、$data->{0}という書き方も分かるのですが、定義した時点でリファレンスではない、$dataに、何故"->"の演算子が使えるのでしょうか? とはいえ、 ref $data ; の戻り値がHASHとなるのも確認しています。 これもどうしてそうなるのか、根本的な原理が分かっておりません。 どうか、このコードの動作原理を教えていただけないでしょうか。 抽象的な質問となっている気がしますが、宜しくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう