Considerații în construirea unui tip șir Secure

voturi
0

Am început construirea unui tip șir securizat - pe care o numesc SecureStringV2 - să se extindă tipul SecureString existent în cadrul .Net. Acest tip nou se va adăuga unele funcționalități de bază ( de verificare pentru egalitate, compararea etc.) cu tipul existent , dar menține în continuare securitatea furnizată de tipul SecureString, care este totul clar din memorie după utilizare tipurile. Am de gând să realizeze aceste caracteristici folosind algoritmi de clasă și hash Marshal. Indicii cu privire la modul de a obține acest lucru făcut și făcut corect ar fi apreciat. Are oricare dintre voi vedea orice probleme cu ideile mele de punere în aplicare a acestei? Mulțumesc :)

Actualizare: Aceasta este în cazul în care ideile mele mi-au dus până în prezent în ceea ce privește clasa de bază a bibliotecii. să aruncați o privire și să-mi spuneți gândurile tale.

/// <summary>
///  This class is extension of the SecureString Class in the .Net framework. 
///  It provides checks for equality of multiple SStringV2 instances and maintains
///  the security provided by the SecureString Class
/// </summary>
public class SStringV2 : IEquatable<SStringV2> , IDisposable
{
    private SecureString secureString = new SecureString();
    private Byte[] sStringBytes;
    private String hash = string.Empty;

    /// <summary>
    ///  SStringV2 constructor
    /// </summary>
    /// <param name=confidentialData></param>
    public SStringV2(ref Char[] confidentialData)
    {
        GCHandle charArrayHandle = GCHandle.Alloc(confidentialData, GCHandleType.Pinned);
        // The unmanaged string splices a zero byte inbetween every two bytes 
        //and at its end  doubling the total number of bytes
        sStringBytes = new Byte[confidentialData.Length*2];
        try
        {
            for (int index = 0; index < confidentialData.Length; ++index)
            {                   
                secureString.AppendChar(confidentialData[index]);
            }
        }
        finally
        {
            ZeroOutSequence.ZeroOutArray(ref confidentialData);
            charArrayHandle.Free();
        }
    }

    /// <summary>
    /// Computes the hash value of the secured string 
    /// </summary>
    private void GenerateHash()
    {
        IntPtr unmanagedRef = Marshal.SecureStringToBSTR(secureString);
        GCHandle byteArrayHandle = GCHandle.Alloc(sStringBytes, GCHandleType.Pinned);
        Marshal.Copy(unmanagedRef, sStringBytes, 0, sStringBytes.Length);
        SHA256Managed SHA256 = new SHA256Managed();

        try
        {
            hash = Convert.ToBase64String(SHA256.ComputeHash(this.sStringBytes));
        }
        finally
        {
            SHA256.Clear();
            ZeroOutSequence.ZeroOutArray(ref sStringBytes);
            byteArrayHandle.Free(); 
            Marshal.ZeroFreeBSTR(unmanagedRef);
        }
    }

    #region IEquatable<SStringV2> Members

    public bool Equals(SStringV2 other)
    {
        if ((this.hash == string.Empty) & ( other.hash == string.Empty))
        { 
            this.GenerateHash();
            other.GenerateHash();
        }
        else if ((this.hash == string.Empty) & !(other.hash == string.Empty))
        {
            this.GenerateHash();
        }
        else if (!(this.hash == string.Empty) & (other.hash == string.Empty))
        {
            other.GenerateHash();
        }

        if (this.hash.Equals(other.hash))
        {
            return true;
        }
            return false;
    }

    #endregion

    #region IDisposable Members

    public void Dispose()
    {
        secureString.Dispose();
        hash = string.Empty;
        GC.SuppressFinalize(this);
    }

    #endregion
}

}

Întrebat 12/03/2009 la 13:30
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

dacă treci un [] matrice char în a începe să-și piardă beneficiile securestring. char [] matrice ar putea fi copiate în jurul valorii în memorie de către colector de gunoi înainte de a fi eliminat.

Publicat 12/03/2009 la 16:30
sursa de către utilizator

voturi
1

Doar o notă de rapid - Ceri probleme confundau egalitate hash cu egalitatea de date - că probabilitatea de a le fi diferit este scăzut, dar odată ce ați lovit va fi un coșmar: / (am avut „norocul“ de a depana și stabilească o implementare personalizată hash-hartă care a făcut aceeași greșeală în urmă cu câțiva ani, așa că vă rugăm să ai încredere în mine;)).

Publicat 12/03/2009 la 17:58
sursa de către utilizator

voturi
1

Nu uitați că SecureString utilizează criptare cu două sensuri. Nu văd nici o criptare din clasa ta.

Publicat 25/08/2010 la 15:28
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more