1

これは、ユニコード文字列の相違点の表示に関する以前の質問のフォローアップです。結局のところ、文字列は同じように見えますが、そのうちの 1 つで UTF8 フラグがオンになっています。

SV = PVMG(0x4cca750) at 0x4b3fc90
 REFCNT = 1
 FLAGS = (PADMY,POK,pPOK,UTF8)
 IV = 0
 NV = 0
 PV = 0x1eda410 "flurbe"\0 [UTF8 "flurbe"]
 CUR = 6
 LEN = 16

SV = PV(0xf28090) at 0xf4b6a0
 REFCNT = 1
 FLAGS = (PADMY,POK,pPOK)
 PV = 0xf37b90 "flurbe"\0
 CUR = 6
 LEN = 16

これにより、文字列を暗号化すると、結果の sha512 ハッシュに違いが生じるようです。ダンサーは、私が知る限り、最初の結果が utf8 になる原因です。他のスクリプトは単なるコマンド ライン スクリプトであり、ダンサーを使用せずに同じように動作させるにはどうすればよいでしょうか?

4

2 に答える 2

5

(これは答えというよりはコメントですが、大きすぎます。)

私はこのプログラムを実行しました:

#!/usr/bin/perl -w

use warnings;
use strict;

use Devel::Peek ();
use Digest::SHA ();

my $x = 'flurbe';

Devel::Peek::Dump $x;

print Digest::SHA::sha512_hex($x), "\n\n";

utf8::upgrade $x;

Devel::Peek::Dump $x;

print Digest::SHA::sha512_hex($x), "\n";

__END__

そしてそれはこの出力を与えました:

SV = PV(0x10441040) at 0x10491638
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x10449ca0 "flurbe"\0
  CUR = 6
  LEN = 8
1cd2e71e55653caeb6c9bffa47a66ff1c9b526bbb732dcff28412090601e9b5e34d36be6a0267527347cd94039b383d4bc45653d786d1041debe7faa0716bdf1

SV = PV(0x10441040) at 0x10491638
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK,UTF8)
  PV = 0x10449ca0 "flurbe"\0 [UTF8 "flurbe"]
  CUR = 6
  LEN = 8
1cd2e71e55653caeb6c9bffa47a66ff1c9b526bbb732dcff28412090601e9b5e34d36be6a0267527347cd94039b383d4bc45653d786d1041debe7faa0716bdf1

ご覧のとおりDevel::Peek::Dump、文字列がUTF-8にアップグレードされたことを正しく識別しますが、これはによって計算されるSHA-512ハッシュには影響しませんDigest::SHA

追加するために編集:上記のコメントで、「ハッシュはランダムに塩漬けにされている」と述べています。これらのソルトにASCII範囲外のバイトを含めることはできますか?その場合、UTF-8でアップグレードされた文字列との連結は、それらの内容に影響を与える可能性があります。私はこの変更されたプログラムを実行しました:

#!/usr/bin/perl -w

use warnings;
use strict;

use Devel::Peek ();
use Digest::SHA ();

my $x = 'flurbe';
my $y = "\xA0";      # a single byte, hex 00A0
my $z = "\xC2\xA0";  # UTF-8 representation of U+00A0, as a byte-string

Devel::Peek::Dump "$x$y";
print Digest::SHA::sha512_hex("$x$y"), "\n\n";

Devel::Peek::Dump "$x$z";
print Digest::SHA::sha512_hex("$x$z"), "\n\n";

utf8::upgrade $x;

Devel::Peek::Dump "$x$y";

print Digest::SHA::sha512_hex("$x$y"), "\n";

__END__

そしてそれはこの出力を与えました:

SV = PV(0x104410e8) at 0x104d68d8
  REFCNT = 1
  FLAGS = (PADTMP,POK,pPOK)
  PV = 0x10449ca0 "flurbe\240"\0
  CUR = 7
  LEN = 8
1901f989ed76143697ecc6683fd03ec793bc126d51cdbee0a72241933136c144f2e602828abddc7e4843df5542a099be92313fa5874d1d2dc54ecdd1ff308c5e

SV = PV(0x104d80b8) at 0x104ec098
  REFCNT = 1
  FLAGS = (PADTMP,POK,pPOK)
  PV = 0x10489170 "flurbe\302\240"\0
  CUR = 8
  LEN = 12
072f7b54c80fa8062ca1d17727a88c9ff4815f83c1166471331c6398b9140a06812eff341c98453f4c51356926dbe9694cbcbebfe4cda7e77cf68008ab838c6d

SV = PV(0x104d80a8) at 0x104f0f98
  REFCNT = 1
  FLAGS = (PADTMP,POK,pPOK,UTF8)
  PV = 0x104896c8 "flurbe\302\240"\0 [UTF8 "flurbe\x{a0}"]
  CUR = 8
  LEN = 12
072f7b54c80fa8062ca1d17727a88c9ff4815f83c1166471331c6398b9140a06812eff341c98453f4c51356926dbe9694cbcbebfe4cda7e77cf68008ab838c6d

ご覧のとおり、のSHA-512ハッシュは、UTF-8にアップグレードされ"$x$y"たかどうかによって異なります。UTF-8-upgradedを使用すると、-UTF-8-upgraded以外の場合と同じSHA-512ハッシュが得られます。これは、SHA-512が文字ではなくバイトで動作し、UTF-8でアップグレードされた文字列をバイト文字列と連結すると、バイト文字列がUTF-8でアップグレードされるためです。$x"$x$y"$x"$x$z"$x

于 2012-03-20T03:18:58.070 に答える
1

エンコーディングの問題、つまりその欠如があります。ダイジェスト機能はオクテットで動作します。あなたはそれに文字を与えますが、それは間違っています。

アクションのコース: 文字をオクテットにエンコードします。UTF-8 は適切なエンコーディングです。

my $octets = Encode::encode('UTF-8', $characters, Encode::FB_CROAK);
# add salt to octets
# produce digest
于 2012-03-20T09:21:51.093 に答える