将C#SHA1代码转换为Golang

时间:2017-03-07 12:04:41

标签: c# go sha1

我需要将一些旧的C#代码转换为Golang并将其粘贴到某处。 C#代码看起来像这样 `

 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);

所以我逐行检查了代码,据我所知,他使用了转换盐和密码字节数组,然后他将这些数组复制到了#d;'阵列。然后他使用SHA1算法并将此数组转换为base64string。

我的Golang代码看起来像这样,但它不会创建存储在数据库中的相同字符串。

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

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

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

有人能找到我的错吗?感谢

1 个答案:

答案 0 :(得分:4)

问题是C#代码正在使用Encoding.Unicode。在Go中它应该是:

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上的另一个回复。