关于这个问题的非常简短的背景:我是一名CS学生,刚刚开始了一个新的学徒软件开发人员职位。我主要使用的是C#,我没有多少经验(我为类/项目编写的大部分内容都是用Java编写的),这是我的经理所知道的所以我认为这不是一个问题。只要问他或其他高级开发人员。但是,我想证明我能够自己解决一些事情,所以我想我先问这里。
基本上我的任务是修改一个用于加密和解密各种信息(如客户信息)的类。我的经理要求我修改程序,以便能够使用几个salt值之一启动加密,每个salt值都是静态的,并与给定的信息类别相关联。他建议我使用枚举器来包含salt值,然后我可以根据加密的信息类型将其引入加密和解密方法,并将其作为字符串参数传递给这些方法。
我浏览了许多类似于this question的线程,这些线程让我对如何创建类似枚举器的结构以包含多对字符串(关键是信息)有了一个不错的想法。类型和值是相关的盐)。但是,我不知道如何将这些值传递给类中的其他方法,因为我无法找到将它们作为参数直接传递给加密和解密方法的方法。我认为可能会有一些混乱的方法,但我想有一个更精致的解决方案,由于我对c#的相对缺乏经验,我不知道。
如果我能提供任何其他信息,请告诉我。很抱歉,如果这个问题很难理解,我已经潜伏在Stack Overflow上多年,但这是我第一次发帖提问,所以我可能没有清楚地表达我的问题。提前感谢您提供的任何帮助。
答案 0 :(得分:0)
加密不使用salt。它使用密钥,可能还有随机填充。 Salt用于散列,并且通常每次都应该是不同的,因此将它们存储在代码中是没有意义的。
加密密钥不会经常更改,但它们也应该能够被更改(在受到损害的情况下),因此将它们存储在代码中也没有意义。他们应该进入配置,或者如果他们是敏感密钥,他们应该进入一个安全的密钥库。如果您没有安全的地方存储它们,可以使用DPAPI加密和解密它们。
确定要存储的位置后,您可以编写一些代码将其读入Dictionary<enum, string>
或Dictionary<enum, byte[]>
,并使用它。例如:
enum KeyType
{
Customer = 1,
Administrator = 2,
Application = 3
}
class Encryptor
{
static readonly Dictionary<KeyType, string> keyLookup = new Dictinary<KeyType, string>();
static public Encryptor()
{
keyLookup.Add(KeyType.Customer, GetCustomerCryptoKey());
keyLookup.Add(KeyType.Administrator, GetAdminCryptoKey());
keyLookup.Add(KeyType.Application, GetApplicationCryptoKey());
}
public string Encrypt(KeyType keyType, string input)
{
var key = keyLookup[keyType];
return EncryptInternal(input, key);
}
}