【问题标题】:Converting C# SHA1 code to Golang将 C# SHA1 代码转换为 Golang
【发布时间】: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,这意味着它将在bytessrc 数组中每个字符产生 2 个字节,并且随后dst 数组。你能检查一下你的 Golang 代码是否正确处理了这个问题?
  • @icza 我不明白为什么盐需要被解释为十六进制字符串?在数据库中它保存为一个字符串。

标签: c# go sha1


【解决方案1】:

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

【讨论】:

  • 像魅力一样工作!谢谢你,我已经为此苦苦挣扎了 2 天
猜你喜欢
  • 2014-12-04
  • 2018-03-21
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2012-04-25
相关资源
最近更新 更多