2012-01-26 3 views

답변

4

은 염장에 사용할 수있는 데이터의 임의의 조각을 만들 수있는 다른 방법이 있습니다. 가장 일반적인 사람은 다음과 같습니다

  • RNGCryptoServiceProvider 클래스를 사용하여 숫자의 임의의 문자열을 만들기 Guid 유형
  • 를 사용하여 임의의 GUID 만들기

것은 새로운 임의의 GUID를 만들려면, 우리는 호출 Guid 유형의 NewGuid 메소드. 일단 생성되면, 암호화 할 문자열에 소금을 추가하기 만하면됩니다.

string saltAsString = Guid.NewGuid().ToString(); 

RNGCryptoServiceProvider은 클래스를 사용하여 자릿수의 임의의 문자열을 만들기 위해, 우리는 먼저 제공하고 byte 배열을 초기화하고 우리 공급자 인스턴스의 메소드를 호출 GetBytes.

byte[] saltInBytes = new byte[8]; 
RNGCryptoServiceProvider saltGenerator = new RNGCryptoServiceProvider(); 
saltGenerator.GetBytes(saltInBytes); 
string saltAsString = Convert.ToBase64String(saltInBytes); 

다음 코드는 소금 절임을 보여주기 위해 이전 스 니펫의 수정 된 버전입니다.

public void HashText() 
{ 
    string textToHash = "password"; 
    string saltAsString = Guid.NewGuid().ToString(); 
    byte[] byteRepresentation 
     = UnicodeEncoding.UTF8.GetBytes(textToHash + saltAsString); 

    byte[] hashedTextInBytes = null; 
    MD5CryptoServiceProvider myMD5 = new MD5CryptoServiceProvider(); 
    hashedTextInBytes = myMD5.ComputeHash(byteRepresentation); 
    string hashedText = Convert.ToBase64String(hashedTextInBytes); 

    // will display X03MO1qnZdYdgyfeuILPmQ== 
    MessageBox.Show(hashedText); 
} 
+0

훨씬 더 좋은 아이디어는 자신의 발명보다는 PBKDF2와 같은 내장 키 유도 기본 요소를 사용하는 것입니다. –

+0

@NickJohnson 나는 단지 돌봐 줄 것이다 .. 나는 현재이 과정을 사용하고있다 .. – Madhu

1

이 기본 멤버 자격 공급자가하는 일입니다 :

internal string EncodePassword(string pass) 
    { 
     string salt = GenerateSalt(); 

     byte[] bytes = Encoding.Unicode.GetBytes(pass); 
     byte[] src = Convert.FromBase64String(salt); 
     byte[] dst = new byte[src.Length + bytes.Length]; 
     Buffer.BlockCopy(src, 0, dst, 0, src.Length); 
     Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); 
     HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); 
     byte[] inArray = algorithm.ComputeHash(dst); 

     return Convert.ToBase64String(inArray); 
    } 

    internal string GenerateSalt() 
    { 
     RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
     byte[] buff = new byte[32]; 
     rng.GetBytes(buff); 
     return Convert.ToBase64String(buff); 
    } 
1
public static string Cipher(object obj) 
{ 
    string j = JSON(obj); 
    using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) 
    { 
     aesAlg.Key = System.Text.Encoding.UTF8.GetBytes("salt"); 
     aesAlg.IV = System.Text.Encoding.UTF8.GetBytes("salt"); 
     ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 
     // Create the streams used for encryption. 
     using (MemoryStream msEncrypt = new MemoryStream()) 
     { 
      using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
      { 
       using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
       { 
        swEncrypt.Write(j); 
       } 
       byte[] encrypted = msEncrypt.ToArray(); 
       return Convert.ToBase64String(encrypted).Replace('/', '-').Replace('+', '_').Replace("=", ""); 
      } 
     } 
    } 
} 
1

난 강력하게 대신 SHA1의 BCrypt 같은 것을 사용하는 것이 좋습니다 것입니다. SHA1을 사용하는 것은 사전 공격에 매우 취약하기 때문에 암호를 저장하는 좋은 방법이 아닙니다. 심지어 소금도 있습니다. SHA1은 빠른 알고리즘으로 많은 양의 데이터를 빠르게 처리 할 수 ​​있도록 설계되었습니다. 더 오래된 컴퓨터에서도 millions of hashes per second을 계산할 수 있습니다.

BCrypt는 수정 된 암호화 알고리즘을 사용하여 소금과 함께 작업 요소이라는 이름을 사용하여 단일 해시를 계산하는 데 비용이 많이 듭니다. 공격자는 합법적 인 검증을 위해 계산할 필요가있는 반면, 해시를 계산할 필요가 있다는 점을 이용합니다.

더 자세한 설명은 우수 기사 How to Safely Store a Password을 참조하십시오.