2017-09-28 15 views
1

vb.netでハッシュ計算に問題があります。良いハッシュを計算し、JavaでJava SHA256ハッシュはvb.netと同じではありません

の作業コードこのコードの

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Base64; 
public class MyClass { 
    public static void main(String args[]) { 
     String test = "line1\nline2"; 
     System.out.println(test); 
     String testOut = getTest(test); 
     System.out.println(testOut); 
} 

public static String getTest(String input) { 
try { 
    MessageDigest md = MessageDigest.getInstance("SHA-256"); 
    md.update(input.getBytes()); 
    return Base64.getEncoder().encodeToString(md.digest()); 
    } 
    catch (NoSuchAlgorithmException e) { 
     throw new RuntimeException(e); 
    } 
}  
} 

出力は

line1 
line2 
aDN24pCCm0gsJlV0XK/6eh3M+hCvqmLawrQt1saND4M= 

vb.netで例を動作していないされて

Dim test As String = "line1\nline2" 
Console.WriteLine(test) 
Dim mySHA256 As SHA256 = SHA256Managed.Create() 
mySHA256.ComputeHash(Encoding.UTF8.GetBytes(test)) 
Dim out = Convert.ToBase64String(mySHA256.Hash) 
Console.WriteLine(out) 

出力を下回っています以下

line1\nline2 
RrUKDuWDeHhbuSYAZlamp7dr3ujXi3v9cm8xvOUtdM0= 

だから、 "\ n"はvb.netの文字の新しい行ではないことが分かりました。だから私は、出力が

line1 
line2 
0UqRptHG7oO/DHdOvsvubYs5OzldrinuqDnDVNb7qcA= 

を下回っているvbNewLine

Dim test2 As String = "line1" + vbNewLine + "line2" 
Console.WriteLine(test2) 
Dim mySHA256_2 As SHA256 = SHA256Managed.Create() 
mySHA256_2.ComputeHash(Encoding.UTF8.GetBytes(test2)) 
Dim out2 = Convert.ToBase64String(mySHA256_2.Hash) 
Console.WriteLine(out2) 

使用私の代わりにComputeHash

Dim test3 As String = "line1" + vbNewLine + "line2" 
Console.WriteLine(test3) 
Dim mySHA256_3 As SHA256 = SHA256Managed.Create() 
mySHA256_3.TransformFinalBlock(Encoding.UTF8.GetBytes(test3), 0, Encoding.UTF8.GetBytes(test3).Length) 
Dim out3 = Convert.ToBase64String(mySHA256_3.Hash) 
Console.WriteLine(out3) 

TransformFinalBlockを使用しようと、出力は前の

line1 
line2 
0UqRptHG7oO/DHdOvsvubYs5OzldrinuqDnDVNb7qcA= 
01と同じです

私は、Javaの改行"\n"が間違ったハッシュを計算するため、問題を引き起こしていると思われます。 "\n"のない文字列がある場合、値は同じです。 vb.netではvbNewLineの代わりにEnvironment.NewLineを使用しようとしました。

+1

VBの '\ n'に相当するのは' vbLF'です。 'Environment.NewLine'と' vbNewLine'はプラットフォームに依存しますが、ウィンドウ内では 'vbCR&vbLF'と同等です。 –

+0

あなたは私の日を救った。迅速な対応に感謝します。私は新しい行のために私のハッシュ値が同じではないことを理解するために何日も立ち往生した。あなたは私がそれを受け入れることができるようにあなたのコメントを回答として投稿することができます。 – KuKeC

答えて

3

あなたが言うように、エンコードしているデータに\nが含まれていない場合、正常に動作します。だから問題は明らかにハッシュアルゴリズムとは関係がありません。問題は、文字列リテラルの\nをVBに正しく変換していないため、2つの入力文字列が異なることです。バイトを出力すると、Javaのものは0x0A(小数点以下10桁)であり、VBのものは新しい行のために0x0D 0x0A(小数点以下は10桁)です。 VBで

vbCR\r0x0D)とvbLFための定数は\n0x0A)に対して一定です。 Environment.NewLineおよびvbNewLineはプラットフォームに依存しますが、ウィンドウ内ではvbCR & vbLFに相当します。

関連する問題