Hashing a string with Sha256

前端 未结 7 1973
一向
一向 2020-12-02 04:31

I try to hash a string using SHA256, I\'m using the following code:

using System;
using System.Security.Cryptography;
using System.Text;
 public class Hash
          


        
相关标签:
7条回答
  • 2020-12-02 04:51

    The shortest and fastest way ever. Only 1 line!

    public static string StringSha256Hash(string text) =>
        string.IsNullOrEmpty(text) ? string.Empty : BitConverter.ToString(new System.Security.Cryptography.SHA256Managed().ComputeHash(System.Text.Encoding.UTF8.GetBytes(text))).Replace("-", string.Empty);
    
    0 讨论(0)
  • 2020-12-02 04:52
    public string EncryptPassword(string password, string saltorusername)
            {
                using (var sha256 = SHA256.Create())
                {
                    var saltedPassword = string.Format("{0}{1}", salt, password);
                    byte[] saltedPasswordAsBytes = Encoding.UTF8.GetBytes(saltedPassword);
                    return Convert.ToBase64String(sha256.ComputeHash(saltedPasswordAsBytes));
                }
            }
    
    0 讨论(0)
  • 2020-12-02 04:52

    This work for me in .NET Core 3.1.
    But not in .NET 5 preview 7.

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace PortalAplicaciones.Shared.Models
    {
        public class Encriptar
        {
            public static string EncriptaPassWord(string Password)
            {
                try
                {
                    SHA256Managed hasher = new SHA256Managed();
    
                    byte[] pwdBytes = new UTF8Encoding().GetBytes(Password);
                    byte[] keyBytes = hasher.ComputeHash(pwdBytes);
    
                    hasher.Dispose();
                    return Convert.ToBase64String(keyBytes);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message, ex);
                }
            }  
        }
    }
     
    
    0 讨论(0)
  • 2020-12-02 04:54
    public static string ComputeSHA256Hash(string text)
    {
        using (var sha256 = new SHA256Managed())
        {
            return BitConverter.ToString(sha256.ComputeHash(Encoding.UTF8.GetBytes(text))).Replace("-", "");
        }                
    }
    

    The reason why you get different results is because you don't use the same string encoding. The link you put for the on-line web site that computes SHA256 uses UTF8 Encoding, while in your example you used Unicode Encoding. They are two different encodings, so you don't get the same result. With the example above you get the same SHA256 hash of the linked web site. You need to use the same encoding also in PHP.

    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

    https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

    0 讨论(0)
  • 2020-12-02 04:55

    Encoding.Unicode is Microsoft's misleading name for UTF-16 (a double-wide encoding, used in the Windows world for historical reasons but not used by anyone else). http://msdn.microsoft.com/en-us/library/system.text.encoding.unicode.aspx

    If you inspect your bytes array, you'll see that every second byte is 0x00 (because of the double-wide encoding).

    You should be using Encoding.UTF8.GetBytes instead.

    But also, you will see different results depending on whether or not you consider the terminating '\0' byte to be part of the data you're hashing. Hashing the two bytes "Hi" will give a different result from hashing the three bytes "Hi". You'll have to decide which you want to do. (Presumably you want to do whichever one your friend's PHP code is doing.)

    For ASCII text, Encoding.UTF8 will definitely be suitable. If you're aiming for perfect compatibility with your friend's code, even on non-ASCII inputs, you'd better try a few test cases with non-ASCII characters such as é and and see whether your results still match up. If not, you'll have to figure out what encoding your friend is really using; it might be one of the 8-bit "code pages" that used to be popular before the invention of Unicode. (Again, I think Windows is the main reason that anyone still needs to worry about "code pages".)

    0 讨论(0)
  • 2020-12-02 04:58

    In the PHP version you can send 'true' in the last parameter, but the default is 'false'. The following algorithm is equivalent to the default PHP's hash function when passing 'sha256' as the first parameter:

    public static string GetSha256FromString(string strData)
        {
            var message = Encoding.ASCII.GetBytes(strData);
            SHA256Managed hashString = new SHA256Managed();
            string hex = "";
    
            var hashValue = hashString.ComputeHash(message);
            foreach (byte x in hashValue)
            {
                hex += String.Format("{0:x2}", x);
            }
            return hex;
        }
    
    0 讨论(0)
提交回复
热议问题