将PCL库哈希代码重写到新的.NET标准库

时间:2017-09-02 10:42:26

标签: c# xamarin hash xamarin.forms .net-standard

基本上,我需要重写以下方法,这些方法适用于较旧的PCL Library项目,但不适用于.NET标准库项目。

    public static string GenerateSalt()
    {
        var buf = new byte[16];
        (new RNGCryptoServiceProvider()).GetBytes(buf);
        return Convert.ToBase64String(buf);
    }

    public static string GenerateHash(string password, string salt)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(password);
        byte[] src = Convert.FromBase64String(salt);
        byte[] dst = new byte[src.Length + bytes.Length];

        System.Buffer.BlockCopy(src, 0, dst, 0, src.Length);
        System.Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
        HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
        byte[] inArray = algorithm.ComputeHash(dst);
        return Convert.ToBase64String(inArray);
    }

到目前为止,我已尝试使用RandomNumberGenerator.Create()RandomNumberGenerator.GetBytes()方法取得进展,但未成功。

我收到错误,说明RandomNumberGenerator是一个接口,因此无法创建任何实例(这是可以理解的),但我想必须有一种方法(我不是很经历过.Net& C#)。

1 个答案:

答案 0 :(得分:1)

尝试做类似的事情:

    public static string GenerateSalt()
    {
        var buf = new byte[16];
        RandomNumberGenerator.Create().GetBytes(buf);
        return Convert.ToBase64String(buf);
    }

    public static string GenerateHash(string password, string salt)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(password); //TODO: consider removing it
        byte[] src = Convert.FromBase64String(salt);
        byte[] dst = new byte[src.Length + bytes.Length];

        System.Buffer.BlockCopy(src, 0, dst, 0, src.Length);
        System.Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);

        var provider = new Rfc2898DeriveBytes(password, src, 1000);
        byte[] inArray = provider.GetBytes(20/*bytes like in SHA-1*/);

        return Convert.ToBase64String(inArray);
    }

或查看1.4版here

的其他可用API