2012-03-20 7 views
1

これはmy previous question on showing unicode string differencesのフォローアップです。文字列は同じように見えますが、一方の文字列でUTF8フラグがオンになっています。ダンサーのutf8はスクリプトではありません。

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

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 

これは、私は、文字列を暗号化すると、得られるSHA512ハッシュとの違いを確認するために表示されます。ダンサーは、最初の結果が私が言うことができる限りutf8を引き起こしているのですが、私の他のスクリプトはダンサーを使用しないでコマンドライン1だけで、同じように振る舞うことができますか?

+0

文字列のutf8ステータスは、そのSHA512ハッシュに影響しません。いずれかの方法で '1cd2e ... 6bdf1'にする必要があります。どのようなハッシュ値を取得していますか? – duskwuff

+0

私は明日仕事を見なければならないでしょうが、どちらかといえば違います。これは私が見つけることができた唯一の違いです。もちろん、どこかで有効になっている他のutf8のものかもしれません。また、私のハッシュは無作為に塩漬けされています... – xenoterracide

+1

@xenoterracide:あなたのランダムな塩はどのように見えますか? UTF-8でアップグレードされていない文字列で、 '\ x00- \ x7F'の範囲外のバイトを含んでいると、UTF-8でアップグレードされた文字列と連結した後に違って見えます。 – ruakh

答えて

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にアップグレードされたことを正しく示していますが、Digest::SHAで計算されたSHA-512ハッシュには影響しません。

編集の追加:上記のコメントでは、あなたの "ハッシュはランダムに塩漬けされている"と言います。これらの塩に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 

"$x$y"のSHA-512ハッシュが$xがUTF-8にアップグレードされたかどうかに依存します。 UTF-8でアップグレードされたは、$xを持つ"$x$z"と同じSHA-512ハッシュを返します。 -UTF-8アップグレード済み$xです。これは、SHA-512が文字ではなくバイトで動作し、UTF-8でアップグレードされた文字列とバイト文字列を連結すると、バイト文字列がUTF-8でアップグレードされるためです。

+0

これはあなたが正しい軌道に乗っているようなにおいをします。 – tchrist

+0

確かに塩 – xenoterracide

1

エンコードに問題があります。エンコードに問題があります。ダイジェスト関数はオクテットで動作します。あなたはそれに文字を付けます、それは間違っています。

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

my $octets = Encode::encode('UTF-8', $characters, Encode::FB_CROAK); 
# add salt to octets 
# produce digest 
+1

[文字列とUTF-8文字列の違いを知る](http://www.effectiveperlprogramming.com/blog/1381) –

関連する問題