将 C# SHA1 代码转换为 Golang
Converting C# SHA1 code to Golang
我需要将一些旧的 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);
所以我逐行检查了代码,据我了解,他使用转换盐和密码字节数组,然后将这些数组复制到 'dst' 数组。然后他使用 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))
有人能找出我的错吗?谢谢
问题是 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
}
取自对 SO 的另一个回复。
我需要将一些旧的 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);
所以我逐行检查了代码,据我了解,他使用转换盐和密码字节数组,然后将这些数组复制到 'dst' 数组。然后他使用 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))
有人能找出我的错吗?谢谢
问题是 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
}