英文:
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算法,并将该数组转换为base64字符串。
我的Golang代码如下,但它没有创建与数据库中存储的相同的字符串。
s := "fish123"
salt := "227EA7ABD26E40608A6EDEB209058D93A632D1D1A52246D0A27F6E447B16AEBF"
h1 := sha1.New()
h1.Write([]byte(salt))
h1.Write([]byte(s))
hashedPassword := base64.StdEncoding.EncodeToString(h1.Sum(nil))
有人能找到我的错误吗?谢谢。
英文:
I need to convert some old C# code to Golang and I stuck somewhere. C# code looks like this
`
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);
so I examined the code line by line and as I understand he used convert the salt and password byte array then he copied these arrays to 'dst' array. Then he used SHA1 algorithm and convert this array to base64string.
My Golang code looks like this but It doesn't create the same string which stores on database.
s := "fish123"
salt := "227EA7ABD26E40608A6EDEB209058D93A632D1D1A52246D0A27F6E447B16AEBF"
h1 := sha1.New()
h1.Write([]byte(salt))
h1.Write([]byte(s))
hashedPassword := base64.StdEncoding.EncodeToString(h1.Sum(nil))
Can anyone find my fault? Thanks
答案1
得分: 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
函数是从 Stack Overflow 上的另一个回答中获取的。
英文:
The problem is that the C# code is using the Encoding.Unicode
. In Go it should be:
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
}
The convertUTF16ToLittleEndianBytes
was taken from another response on SO.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论