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에서도 동일한 인코딩을 사용해야 합니다.
모든 소프트웨어 개발자의 최소값 절대적으로 유니코드 및 문자 집합에 대해 반드시 알아야 합니다(변명 없음!)
새로운 .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
'sourcecode' 카테고리의 다른 글
인쇄 미리 보기에 배경색이 표시되지 않음 (0) | 2023.10.21 |
---|---|
wc_get_products()의 결과를 json 인코딩할 수 없습니다. (0) | 2023.10.21 |
부트스트랩-선택 - 변경 시 이벤트를 발생시키는 방법 (0) | 2023.10.21 |
조각과 해당 컨테이너 활동 사이에 데이터 전달 (0) | 2023.10.21 |
각 JS 명명 규칙($, camelCase 및 pascalCase) (0) | 2023.10.21 |