Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此加密方法对Windows应用程序安全吗?_C#_Encryption_.net Core - Fatal编程技术网

C# 此加密方法对Windows应用程序安全吗?

C# 此加密方法对Windows应用程序安全吗?,c#,encryption,.net-core,C#,Encryption,.net Core,我正在创建一个库来执行一些使用OAuth2的RESTAPI调用。我想缓存刷新令牌,这样用户就不必在每次登录时重新进行身份验证,尽管我对加密几乎一无所知。微软文档表示,对于像字符串这样的小块数据,非对称加密是一种可行的方法。下面是我的类,用于将加密令牌存储在计算机上某个位置的文件中(由调用代码指定)。它能用,我只是不确定它有多安全 字符串文件; 常量字符串_containerName=“MyTokenCache”; 公共EncryptedTokenCache(字符串文件位置) { _文件=文件位

我正在创建一个库来执行一些使用OAuth2的RESTAPI调用。我想缓存刷新令牌,这样用户就不必在每次登录时重新进行身份验证,尽管我对加密几乎一无所知。微软文档表示,对于像字符串这样的小块数据,非对称加密是一种可行的方法。下面是我的类,用于将加密令牌存储在计算机上某个位置的文件中(由调用代码指定)。它能用,我只是不确定它有多安全


字符串文件;
常量字符串_containerName=“MyTokenCache”;
公共EncryptedTokenCache(字符串文件位置)
{
_文件=文件位置;
}
公共void保存令牌(字符串令牌)
{
var rsa=CreateRSAProvider(_containerName);
var encryptedData=rsa.Encrypt(Encoding.UTF8.GetBytes(token),RSAEncryptionPadding.Pkcs1);
写入文件(加密数据);
}
公共字符串GetToken()
{
var rsa=CreateRSAProvider(_containerName);
var encryptedData=ReadFromFile();
var decryptedData=rsa.Decrypt(encryptedData,RSAEncryptionPadding.Pkcs1);
返回Encoding.UTF8.GetString(decryptedData);
}
专用RSA CreateRSAProvider(字符串containerName)
{
CspParameters=新的CspParameters
{
KeyContainerName=容器名称
};
返回新的RSACryptoServiceProvider(参数);
}
私有void WriteToFile(字节[]数据)
{
使用(var fs=new FileStream(_file,FileMode.OpenOrCreate,FileAccess.Write,FileShare.None))
{
fs.Write(数据,0,数据长度);
}
}
专用字节[]ReadFromFile()
{
字节[]数据;
使用(var fs=new FileStream(_file,FileMode.OpenOrCreate,FileAccess.Read,FileShare.None))
{
数据=新字节[fs.Length];
fs.Read(数据,0,(int)fs.Length);
}
返回数据;
}
好吧,它只是RSA/PKCS#1 v1.5加密。原则上,您最好使用OAEP,因为它是:

  • 可证明的安全和
  • 不易受到oracle攻击
  • 但对于存储令牌,PKCS#1 v1.5应该可以


    此外,您还可以使用AES使用对称加密,因为当前每次创建类时都会创建密钥对。这意味着私钥与公钥在同一位置可用,因此非对称加密带来的安全性不会直接使用。也就是说,我不认为有任何迫切的需要在这个特定的用例中使用AES。

    一般来说,任何这样的问题的答案都是“不安全”。也许你问的是没有安全代码,只是还没有被确定为不安全的代码。成为一名安全专家需要几年才能发现不安全感。如果你真的想要安全的代码,那就请专家帮忙吧。我不想玷污这里的任何人,但你对这个问题的任何回答都表明你的代码是安全的,这只不过是回答者的经验而已,而且你并不容易知道。@Enigmativity谢谢你,这个特定的代码不需要特别超级安全,只是比以纯文本形式存储它更安全。我主要担心的是,
    rsacryptserviceprovider
    在幕后正确地创建/处理密钥。因此,您的实现基本上遵循了Microsoft在此提供的代码:本质上,风险在于底层CSP发生更改,导致无法再检索密钥。根据Windows的版本、硬件、AD成员资格,密钥的实际存储位置和安全性可能会发生变化。因此,您的风险实际上是,升级Windows的用户有朝一日将无法解密您存储的数据。由于您使用的代码,此处的攻击很可能是针对Windows和.net framework中的互操作,而不是您作为应用程序的一部分提供的特定代码(当然,除了攻击者能够看到您使用的“容器名称”纯文本这一事实)令牌是从OAuth响应返回的,它是json。唯一有效的其他填充类型是
    rsacencryptionpadding.OaepSHA1
    ,其他类型提供加密例外SHA-1对于OAEP来说很好。实际上,MGF1(OAEP中的掩码生成函数)并不真正关心SHA-1或使用什么哈希。唯一的诀窍就是向审计员解释:)