sourcecode

SHA256으로 문자열 해시

copyscript 2023. 10. 21. 10:40
반응형

SHA256으로 문자열 해시

SHA256을 사용하여 문자열을 해시하려고 합니다. 다음 코드는 다음과 같습니다.

using System;
using System.Security.Cryptography;
using System.Text;
 public class Hash
    {
    public static string getHashSha256(string text)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(text);
        SHA256Managed hashstring = new SHA256Managed();
        byte[] hash = hashstring.ComputeHash(bytes);
        string hashString = string.Empty;
        foreach (byte x in hash)
        {
            hashString += String.Format("{0:x2}", x);
        }
        return hashString;
    }
}

그러나 이 코드는 온라인 생성기(이 생성기와 같은) 뿐만 아니라 내 친구 php와 비교했을 때 상당히 다른 결과를 제공합니다.

오류가 무엇인지 아는 사람?다른 베이스?

Encoding.Unicode는 마이크로소프트의 UTF-16에 대한 오해의 소지가 있는 이름입니다.http://msdn.microsoft.com/en-us/library/system.text.encoding.unicode.aspx

당신이 당신의 것을 검사한다면.bytes열,매 을 알 수 0x00(더블 와이드 인코딩 때문에).

사용해야 합니다.Encoding.UTF8.GetBytes대신.

또한 종료 여부에 따라 다른 결과가 나타날 것입니다.'\0'데이터의 일부가 될 바이트입니다.두 바이트를 해시합니다."Hi"3바이트를 해싱하는 것과는 다른 결과를 줄 것입니다."Hi" 것 것을 (친구의 PHP 코드가 하고 있는 것은 무엇이든 하고 싶은지 결정해야 합니다.)

ASCII 텍스트의 경우,Encoding.UTF8틀림없이 적합할 것입니다ASCII가 아닌 입력에서도 친구의 코드와 완벽한 호환성을 목표로 한다면 ASCII가 아닌 경우 몇 가지 테스트 사례를 사용해 보는 것이 좋습니다.다음과 같은 II 문자é그리고.결과가 일치하는지 확인해 보세요 그렇지 않다면 친구가 실제로 사용하는 인코딩이 무엇인지 . 유니코드가발명되기 전에 인기 있었던 8비트 "코드 " 중 하나일 수도 있습니다.그렇지 않다면 친구가 실제로 사용하는 인코딩이 무엇인지 파악해야 합니다. 유니코드가 발명되기 전에 인기 있었던 8비트 "코드 페이지" 중 하나일 수도 있습니다.(다시 한 번 말하지만, 누구나 여전히 "코드 페이지"에 대해 걱정해야 하는 주된 이유는 Windows(윈도우)라고 생각합니다.

다른 방식의 구현에도 문제가 있었는데 2년 전이라 어디서 구했는지 잊어버렸습니다.

static string sha256(string randomString)
{
    var crypt = new SHA256Managed();
    string hash = String.Empty;
    byte[] crypto = crypt.ComputeHash(Encoding.ASCII.GetBytes(randomString));
    foreach (byte theByte in crypto)
    {
        hash += theByte.ToString("x2");
    }
    return hash;
}

내가 입력할 때 다음과 같은 것을.abcdefghi2013어떤 이유에서인지 그것은 다른 결과를 주고 내 로그인 모듈에 오류를 초래합니다.그리고 나서 Quuxplusone에서 제시한 것과 같은 방법으로 코드를 수정해보고 인코딩을 변경했습니다.ASCII.UTF8드디어 효과가 있었군요!

static string sha256(string randomString)
{
    var crypt = new System.Security.Cryptography.SHA256Managed();
    var hash = new System.Text.StringBuilder();
    byte[] crypto = crypt.ComputeHash(Encoding.UTF8.GetBytes(randomString));
    foreach (byte theByte in crypto)
    {
        hash.Append(theByte.ToString("x2"));
    }
    return hash.ToString();
}

멋지고 자세한 답변 다시한번 Quuxplusone 감사합니다! :)

public static string ComputeSHA256Hash(string text)
{
    using (var sha256 = new SHA256Managed())
    {
        return BitConverter.ToString(sha256.ComputeHash(Encoding.UTF8.GetBytes(text))).Replace("-", "");
    }                
}

결과가 다르게 나오는 이유는 동일한 문자열 인코딩을 사용하지 않기 때문입니다.SHA256을 계산하는 온라인 웹 사이트에 대해 연결한 링크는 UTF8 Encoding을 사용하는 반면 예제에서는 Unicode Encoding을 사용했습니다.두 개의 서로 다른 인코딩이므로 동일한 결과를 얻지 못합니다.위의 예를 사용하면 링크된 웹 사이트의 SHA256 해시와 동일한 SHA256 해시를 얻을 수 있습니다.PHP에서도 동일한 인코딩을 사용해야 합니다.

모든 소프트웨어 개발자의 최소값 절대적으로 유니코드 및 문자 집합에 대해 반드시 알아야 합니다(변명 없음!)

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

새로운 .NET 5+ 솔루션:

사용하시는 분들은.NET 5 이상, 이제 3줄의 코드만으로 이를 달성할 수 있습니다.

string QuickHash(string input)
{
    var inputBytes = Encoding.UTF8.GetBytes(input);
    var inputHash = SHA256.HashData(inputBytes);
    return Convert.ToHexString(inputHash);
}

string hash = QuickHash("...");

위의 코드:

  • 에 새로운 정적 메서드를 사용합니다.SHA256인스턴스화 및 매번 새 인스턴스를 폐기해야 하는 것을 방지하기 위한 클래스입니다.
  • 새로운 방법을 사용하여 해시 바이트 배열을 16진수 문자열로 변환하여 문자열 작성기 등을 사용하는 번거로움을 없앱니다.
  • 이전(현재는 사용되지 않음) 클래스가 아닌 새 클래스를 사용합니다.
  • UTF-8 인코딩을 사용하여 입력 문자열을 허용된 답변에 의해 권장된 바이트 배열로 변환합니다.

참고: 사용자 암호를 해시할 때 이 방법을 사용하면 안 됩니다.SHA-256과 같은 범용 해싱 기능은 소금을 추가하더라도 더 이상 비밀번호에 사용하기에 적합하지 않습니다.랜덤으로 생성된 긴 세션 토큰 등 엔트로피가 높은 문자열을 해싱하는 데 유용합니다.암호를 저장하려면 Bcrypt, Scrypt 또는 PBKDF2와 같이 이러한 목적으로 특별히 설계된 느린 해싱 기능을 살펴야 합니다(후자는 에서 기본적으로 사용 가능).NET — 참조)

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));
            }
        }

가장 짧고 빠른 방법.한 줄만!

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);

PHP 버전에서는 마지막 매개 변수에서 'true'를 보낼 수 있지만 기본값은 'false'입니다.다음 알고리즘은 첫 번째 매개 변수로 'sha256'을 통과할 때 기본 PHP의 해시 함수와 같습니다.

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;
    }

이 답변들을 찾아보고 테스트했는데 Visual Studio에서 SHA256 Managed가 이제는 사용되지 않음을 보여주었습니다(여기).

그래서 SHA256 클래스를 대신 사용했습니다.

Encoding enc = Encoding.UTF8;
var hashBuilder = new StringBuilder();
using var hash = SHA256.Create();
byte[] result = hash.ComputeHash(enc.GetBytes(yourStringToHash));
foreach (var b in result)
    hashBuilder.Append(b.ToString("x2"));
string result = hashBuilder.ToString();

이 일은 나에게 도움이 됩니다.NET Core 3.1.
근데 안에.NET 5 미리 보기 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);
            }
        }  
    }
}
 

언급URL : https://stackoverflow.com/questions/12416249/hashing-a-string-with-sha256

반응형