2017-03-07 2 views
2

일부 오래된 C# 코드를 Golang으로 변환해야하며 어딘가에 머물러 있습니다. C# 코드 그래서 나는 선으로 코드 라인을 검토하고 내가 이해 그가 소금과 암호를 바이트 배열 한 후 변환을 사용 그가 'DST'배열이 배열을 복사 한이 `C# SHA1 코드를 Golang으로 변환

byte[] bytes = Encoding.Unicode.GetBytes(password); 
byte[] src = Encoding.Unicode.GetBytes(salt); 
byte[] dst = new byte[src.Length + bytes.Length]; 
Buffer.BlockCopy(src, 0, dst, 0, src.Length); 
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); 
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 
byte[] inArray = algorithm.ComputeHash(dst); 
return Convert.ToBase64String(inArray); 

것 같습니다. 그런 다음 SHA1 알고리즘을 사용하고이 배열을 base64string으로 변환합니다.

My Golang 코드는 다음과 유사하지만 데이터베이스에 저장되는 문자열과 동일한 문자열을 생성하지 않습니다.

s := "fish123" 
salt := "227EA7ABD26E40608A6EDEB209058D93A632D1D1A52246D0A27F6E447B16AEBF" 

h1 := sha1.New() 
h1.Write([]byte(salt)) 
h1.Write([]byte(s)) 

hashedPassword := base64.StdEncoding.EncodeToString(h1.Sum(nil)) 

누구든지 내 잘못을 찾을 수 있습니까? 감사합니다

+2

나는 Golang을 모르지만, 가장 먼저 알아챈 것은'Encoding.Unicode.GetBytes'를 사용하고 있다는 것입니다. 이는'bytes'와'src' 배열에 문자 당 2 바이트를 생성한다는 것을 의미합니다. 'dst' 배열. Golang 코드가 올바르게 처리되는지 확인할 수 있습니까? – Paya

+0

@icza 왜 소금을 16 진수 문자열로 해석해야하는지 이해할 수 없습니까? 데이터베이스에서 그것은 문자열로 저장됩니다. –

답변

4

문제는 C# 코드가 Encoding.Unicode을 사용하고 있다는 것입니다. 이동 그것은해야한다 :

package main 

import (
    "crypto/sha1" 
    "encoding/base64" 
    "encoding/binary" 
    "fmt" 
    "unicode/utf16" 
) 

func main() { 
    s := "fish123" 
    salt := "227EA7ABD26E40608A6EDEB209058D93A632D1D1A52246D0A27F6E447B16AEBF" 

    h1 := sha1.New() 
    h1.Write(convertUTF16ToLittleEndianBytes(salt)) 
    h1.Write(convertUTF16ToLittleEndianBytes(s)) 

    b64 := base64.StdEncoding.EncodeToString(h1.Sum(nil)) 
    fmt.Println(b64) 
} 

func convertUTF16ToLittleEndianBytes(s string) []byte { 
    u := utf16.Encode([]rune(s)) 
    b := make([]byte, 2*len(u)) 
    for index, value := range u { 
     binary.LittleEndian.PutUint16(b[index*2:], value) 
    } 
    return b 
} 

convertUTF16ToLittleEndianBytes은 SO의 다른 응답에서 가져온 것입니다.

+0

은 매력처럼 작동합니다! 고맙다. 나는 2 일 동안 이것을 고심하고 있었다. –