Pure PHP で SHA-256 を実装した人もいるけど、使ってみたところパフォーマンス的に苦しかったので mhash を使って適当に作ってみた。256 を 224/384/512 に変えても OK.
function sha256($str, $raw_output = false) { $hash = mhash(MHASH_SHA256, $str); return ($raw_output) ? $hash : bin2hex($hash); } function sha256_file($filename, $raw_output = false) { return sha256(file_get_contents($filename), $raw_output); }
FreeBSD 6.0 には sha1 も sha256 もデフォルトでインストールされているけど、Mac OS X にはないので、これを応用してコマンドライン用の sha256 ツールを作ってみた。
#!/usr/bin/env php <?php if (!extension_loaded('mhash')) { dl('mhash.so') or exit(2); } $err = 0; if ($argc > 1) { for ($i = 1; $i < $argc; $i++) { $file = $argv[$i]; if (file_exists($file)) { if (is_readable($file)) { $hash = bin2hex(mhash(MHASH_SHA256, file_get_contents($file))); fwrite(STDOUT, sprintf("SHA256 (%s) = %s\n", $file, $hash)); } else { fwrite(STDERR, sprintf("sha256: %s: Permission.denied\n", $file)); $err = 1; } } else { fwrite(STDERR, sprintf("sha256: %s: No such file or directory\n", $file)); $err = 1; } } } else { $buf = ''; while (!feof(STDIN)) { $buf .= fread(STDIN, 500000); } fwrite(STDOUT, bin2hex(mhash(MHASH_SHA256, $buf))); fwrite(STDOUT, "\n"); } exit($err); ?>
sha1 はシェルの設定ファイルに
alias sha1='openssl sha1'
で。