在可以解密密码的类上将类设置为内部足够

时间:2016-05-10 15:49:29

标签: c# encryption

以下是我刚才在互联网上找到的加密/解密课程的精简版。

我一直用它来以加密格式将密码存储在配置文件中,这样就无法通过窥探来阅读它。然后可以解密inapp以访问网络资源。

我使用它来阻止任何人以任何方式阅读纯文本密码,例如配置文件,将其作为命令行变量传递,该变量必须在计划任务中等。

这是一个控制台应用程序,其中一个命令行参数允许用户获取他们提供的字符串密码的加密版本,没有可公开访问的解密方法。

将类设置为内部足以阻止某人调用Decrypt方法或对加密密码进行反向工程,我猜测它会阻止任何人引用它并只调用解密方法但我可以做任何其他事情来加强安全吗?

我考虑过将Key和Vector从外部传递给构造函数但是不确定它是否真的有助于提高安全性,如果它们仍然在同一个dll中,如果有人可以得到那些字节那么重要他们被存储了吗?

internal class SimpleAES
{
    private byte[] Key = { 1, 2, .. n };
    private byte[] Vector = { 1, 2, .. n };

    private ICryptoTransform EncryptorTransform, DecryptorTransform;
    private System.Text.UTF8Encoding UTFEncoder;

    public SimpleAES()
    {
        RijndaelManaged rm = new RijndaelManaged();
        EncryptorTransform = rm.CreateEncryptor(this.Key, this.Vector);
        DecryptorTransform = rm.CreateDecryptor(this.Key, this.Vector);
        UTFEncoder = new System.Text.UTF8Encoding();
    }

    public string EncryptToString(string TextValue)
    {
        return ByteArrToString(Encrypt(TextValue));
    }

    public byte[] Encrypt(string TextValue)
    {
        Byte[] bytes = UTFEncoder.GetBytes(TextValue);
        MemoryStream memoryStream = new MemoryStream();

        CryptoStream cs = new CryptoStream(memoryStream, EncryptorTransform, CryptoStreamMode.Write);
        cs.Write(bytes, 0, bytes.Length);
        cs.FlushFinalBlock();

        memoryStream.Position = 0;
        byte[] encrypted = new byte[memoryStream.Length];
        memoryStream.Read(encrypted, 0, encrypted.Length);

        cs.Close();
        memoryStream.Close();

        return encrypted;
    }

    public string DecryptString(string EncryptedString)
    {
        return Decrypt(StrToByteArray(EncryptedString));
    }

    public string Decrypt(byte[] EncryptedValue)
    {
        MemoryStream encryptedStream = new MemoryStream();
        CryptoStream decryptStream = new CryptoStream(encryptedStream, DecryptorTransform, CryptoStreamMode.Write);
        decryptStream.Write(EncryptedValue, 0, EncryptedValue.Length);
        decryptStream.FlushFinalBlock();

        encryptedStream.Position = 0;
        Byte[] decryptedBytes = new Byte[encryptedStream.Length];
        encryptedStream.Read(decryptedBytes, 0, decryptedBytes.Length);
        encryptedStream.Close();

        return UTFEncoder.GetString(decryptedBytes);
    }
}

1 个答案:

答案 0 :(得分:9)

无论您选择哪种辅助功能,无论是publicinternalprivate还是其他任何辅助工具,绝对无关具有安全性。您的代码除了隐藏值之外什么也没做,但是甚至没有真正数据安全性的远程连接。

潜在的攻击者只需几分钟即可显示“加密”字样。值。这里的基本要点是KeyVector 内置于软件本身,因此一旦您获得二进制文件的访问权限,您就可以访问这些信息。因此,整个事情是设计不安全

推荐文献:Bruce Schneier, Applied Cryptography