简体   繁体   中英

The type or namespace name 'RNGCryptoServiceProvider' could not be found in DNX Core 5.0

I have Hash Generator class. This should work, but I have problem in Visual Studio 2015. I get errors

The type or namespace name 'RNGCryptoServiceProvider' could not be found (are you missing a using directive or an assembly reference?)

The type or namespace name 'SHA256Managed' could not be found (are you missing a using directive or an assembly reference?)

Problem is that this exist in DNX 4.5.1, but not in DNX Core 5.0

public class HashGenerator : IHashGenerator
{
    public string GenerateHash(string input, String salt)
    {
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
        SHA256Managed sha256hashstring = new SHA256Managed();
        byte[] hash = sha256hashstring.ComputeHash(bytes);
        return Convert.ToBase64String(bytes);
    }

    public string CreateSalt(int size)
    {
        var rng = new RNGCryptoServiceProvider();
        var buff = new byte[size];
        rng.GetBytes(buff);
        return Convert.ToBase64String(buff);
    }
}

How to make this work in both frameworks in Visual Studio 2015?

My project.json file

 "dependencies": {
    "EntityFramework.Commands": "7.0.0-beta8-15718",
    "4tecture.DataAccess.Common": "1.0.0-*",
    "4tecture.DataAccess.EntityFramework": "1.0.0-*",
    "EntityFramework.Relational": "7.0.0-beta8-15723",
    "EntityFramework.SqlServer": "7.0.0-beta8-15797",
    "Microsoft.Framework.ConfigurationModel": "1.0.0-beta5-11337"
  },

  "frameworks": {
    "dnx451": {
      "dependencies": {
      }
    },
    "dnxcore50": {
      "dependencies": {
        "System.Linq": "4.0.1-beta-23302",
        "System.Runtime.Serialization.Primitives": "4.0.11-beta-23302"
      }
    }

Thanks for help

In DNX Core 5.0 you need to add a package reference to System.Security.Cryptography.RandomNumberGenerator and switch from RNGCryptoServiceProvider to the RandomNumberGenerator class.

Since DNX Core is meant to be cross platform, the RNGCryptoServiceProvider can no longer work. The concept of a "crypto service provider" typically means it's implemented by CAPI in Windows. Hence it has been replaced.

Solution I implemented at the end.

 public class HashGenerator : IHashGenerator
    {
        public string GenerateHash(string input, string salt)
        {
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
            var hashAlgoritm = System.Security.Cryptography.MD5.Create();
            bytes = hashAlgoritm.ComputeHash(bytes);
            return Convert.ToBase64String(bytes);
        }

        public string CreateSalt()
        {
            var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
            var buff = new byte[25];
            rng.GetBytes(buff);
            return Convert.ToBase64String(buff);
        }
    }

I could not use SHA256Managed, i had namespace issue all the time. And it does not require any changes in project.json file

Try adding the dependency for this class to the project.json file

"dependencies": {
"EntityFramework.Commands": "7.0.0-beta8-15718",
"4tecture.DataAccess.Common": "1.0.0-*",
"4tecture.DataAccess.EntityFramework": "1.0.0-*",
"EntityFramework.Relational": "7.0.0-beta8-15723",
"EntityFramework.SqlServer": "7.0.0-beta8-15797",
"Microsoft.Framework.ConfigurationModel": "1.0.0-beta5-11337"
  },

    "frameworks": {
     "dnx451": {
     "dependencies": {
    }
 },
"dnxcore50": {
  "dependencies": {
    "System.Linq": "4.0.1-beta-23302",
    "System.Runtime.Serialization.Primitives": "4.0.11-beta-23302",
    "System.Security.Cryptography.Algorithms": "4.0.0-beta-23225",
    "System.Security.Cryptography.RandomNumberGenerator": "4.0.0-beta-23225"
  }
}

and then changing the RNGCryptoServiceProvider class to RandomNumberGenerator and using the Create method, to return an instance of RNGCryptoServiceProvider.

public class HashGenerator : IHashGenerator
{
  public string GenerateHash(string input, String salt)
  {
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
    SHA256Managed sha256hashstring = new SHA256Managed();
    byte[] hash = sha256hashstring.ComputeHash(bytes);
    return Convert.ToBase64String(bytes);
  }

  public string CreateSalt(int size)
  {
    var rng = RandomNumberGenerator.Create();
    var buff = new byte[size];
    rng.GetBytes(buff);
    return Convert.ToBase64String(buff);
  }
}

since answer is incomplete (OP: I could not use SHA256Managed ) i'm posting a solution for how to use SHA256Managed in DNX Core 5.0

in DNX 4.5.1

HashAlgorithm hash = new SHA256Managed();

in DNX Core 5.0 (which also works with DNX 4.5.1)

HashAlgorithm hash = SHA256.Create();

same applies for all bits (384, 512..)

and you dont need any version dependent packages. just using System.Security.Cryptography is enough.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM