我需要将一些旧的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))
有人能找到我的错吗?感谢
答案 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上的另一个回复。