2016-12-07 7 views
2

は私のC#のRfc2898DeriveBytesあるRfc2898DeriveBytesここ

using System; 
using System.Text; 
using System.Security.Cryptography; 

public class Program 
{ 
    public static void Main() 
    { 
     byte[] saltBytes = Encoding.Unicode.GetBytes("47687"); 
     Console.WriteLine(Convert.ToBase64String(saltBytes)); 

     byte[] passBytes = Encoding.Unicode.GetBytes("123456"); 
     Console.WriteLine(Convert.ToBase64String(passBytes)); 

     Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(passBytes, saltBytes, 1000); 
     byte[] hashbyte = k1.GetBytes(32); 

     Console.WriteLine(Convert.ToBase64String(hashbyte)); 
    } 
} 

結果が NAA3ADYAOAA3AAです== MQAyADMANAA1ADYA aOyDnGG22ebqGmMvY7zQwdT + UKF6hUUmAt2Uc0jj2io =

マイgolangコードは

package main 

import (
    "crypto/sha1" 
    "fmt" 
    "golang.org/x/crypto/pbkdf2" 
    b64 "encoding/base64" 
) 

var (
    PasswordSecuritySalt  = "47687" 
    PasswordSecurityIterations = 1000 
    PasswordSecurityKeylen  = 32 
) 

func HashPassword(str string) string { 
    hashedPassword := pbkdf2.Key([]byte(str), []byte(PasswordSecuritySalt), PasswordSecurityIterations, PasswordSecurityKeylen, sha1.New) 
    return b64.StdEncoding.EncodeToString(hashedPassword) 
} 

func main() { 
    password := "123456" 
    fmt.Println(PasswordSecuritySalt + " " + password) 
    fmt.Println(HashPassword(password)) 

} 

結果が です47687 123456 EVqb1dCe8p + iVEquNjJmHhSjruGATNQX73F6msXivM8 =

なぜgolang結果のハッシュパスワードがC#と異なるのですか?私を助けてください。

答えて

3

.NETはUTF-16文字列を使用しているため、GoはUTF-8文字列を使用していますが、各文字は少なくとも2バイトで表されます。

C#:

Encoding.Unicode.GetBytes("47687") // [52 0 55 0 54 0 56 0 55 0] 

ゴー:

[]byte("47687") // [52 55 54 56 55] 

あなたはC#で、あなたの囲碁のアプリケーションで同じ結果を取得したい私は、UTF-16へ移動文字列を変換する必要がありますバイトスライス:

package main 

import (
    "crypto/sha1" 
    b64 "encoding/base64" 
    "encoding/binary" 
    "fmt" 
    "golang.org/x/crypto/pbkdf2" 
    "unicode/utf16" 
) 

var (
    PasswordSecuritySalt  = "47687" 
    PasswordSecurityIterations = 1000 
    PasswordSecurityKeylen  = 32 
) 

func stringToUTF16Bytes(s string) []byte { 
    runes := utf16.Encode([]rune(s)) 
    bytes := make([]byte, len(runes)*2) 
    for i, r := range runes { 
     binary.LittleEndian.PutUint16(bytes[i*2:], r) 
    } 
    return bytes 
} 

func HashPassword(str string) string { 
    hashedPassword := pbkdf2.Key(stringToUTF16Bytes(str), stringToUTF16Bytes(PasswordSecuritySalt), PasswordSecurityIterations, PasswordSecurityKeylen, sha1.New) 
    return b64.StdEncoding.EncodeToString(hashedPassword) 
} 

func main() { 
    fmt.Println(HashPassword("123456")) 
}