プロが教えるわが家の防犯対策術!

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を指定することが前提です。

ご教授頂きますようよろしくお願いいたします。

A 回答 (2件)

C#はSHA256を計算しているのにPHPはHMAC-SHA256を計算しているのですから,異なるのは当然です。


HMACはハッシュ関数を使ってメッセージ認証コードを作成するための方法です。

PHPでハッシュを計算するのであれば,hash関数を利用します。
ref) http://php.net/manual/ja/function.hash.php
# MD5とSHA1は専用関数がありますが,現時点においてこれらのハッシュ関数の使用は推奨されません。

もし,C#で実はHMAC-SHA256が欲しいのであれば,HMACSHA256クラスを利用します。
ref) http://msdn.microsoft.com/ja-jp/library/system.s …
    • good
    • 0
この回答へのお礼

始めはhashを使用して処理をしていたのですが、結果が合わず、hash_hmac関数を使用しました。

hashを使用することはわかりましたので、再度、確認します。

お礼日時:2015/01/11 13:08

『同じことをしたいコード』に全く見えないのですが、


とりあえず気になる点だけ。

・C# :string tmp = salt.Substring(0, m) + data + salt.Substring(m);
 PHP:$tmp = substr($salt,0,$m).$id.substr($salt,$m);
 この2行は同じ処理を想定しているのでしょうか?

・PHP の $tmp = base64_encode(utf8_encode($tmp));
 は不要な処理では。少なくとも、ここで base64_encode を実行
 するのは誤りでしょう。C# 側にはそんな処理入っていませんので。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
>・C# :string tmp = salt.Substring(0, m) + data + salt.Substring(m);
>PHP:$tmp = substr($salt,0,$m).$id.substr($salt,$m);
>この2行は同じ処理を想定しているのでしょうか?
同じ処理を想定しております。

>PHP の $tmp = base64_encode(utf8_encode($tmp));
>は不要な処理では。少なくとも、ここで base64_encode を実行
>するのは誤りでしょう。C# 側にはそんな処理入っていませんので
ありがとうございます。
情報ありがとうございます。

お礼日時:2015/01/11 13:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!