【发布时间】:2017-03-07 12:04:41
【问题描述】:
我需要将一些旧的 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))
谁能找到我的错?谢谢
【问题讨论】:
-
我不知道 Golang,但我注意到的第一件事是他使用了
Encoding.Unicode.GetBytes,这意味着它将在bytes和src数组中每个字符产生 2 个字节,并且随后dst数组。你能检查一下你的 Golang 代码是否正确处理了这个问题? -
@icza 我不明白为什么盐需要被解释为十六进制字符串?在数据库中它保存为一个字符串。