Encryption AES-256最佳实践实施
我正在反转一个应用程序,但我不是AES算法的专家。 应用程序为用户提供了离线登录的机会 要求用户提供其用户名和密码 这是用于存储用户信息的函数Encryption AES-256最佳实践实施,encryption,aes,Encryption,Aes,我正在反转一个应用程序,但我不是AES算法的专家。 应用程序为用户提供了离线登录的机会 要求用户提供其用户名和密码 这是用于存储用户信息的函数 public void EncryptLoginInfo(string username, byte[] secretShared, byte[] salt) { byte[] random = calc.GenerateRandomBytes(); byte[] array = aes.Encrypt(secretShared, ran
public void EncryptLoginInfo(string username, byte[] secretShared, byte[] salt)
{
byte[] random = calc.GenerateRandomBytes();
byte[] array = aes.Encrypt(secretShared, random);
OfflineLogin loginInfo = new OfflineLogin()
{
Username = username,
SecretShared = array,
Iv = random,
Salt = salt
};
this._userCredentials.StoreOfflineLoginData(username, loginInfo);
}
这是存储在应用程序内部配置文件中的信息。在下面的示例中,传递给encryptLoginInfo的密码是123
Username: not_important
SecretShared: 4KVrjy1cQVWYpWF7aolpMS0HzhKyFf+9VXauQrXoXVUbf0bGXIDOLDJuSVhYoFo2
Iv:yil4nn02IoKsOnX5KXVsDg==
Salt: 5kJio2VQEqjomHRdQMqRVJ0zkBsmqi8K3NypC2VWJk4
如果用户希望进行脱机登录,则要求其提供用户名和密码
问题:这个算法安全吗?如果攻击者能够获得SecretShared+Iv+Salt,他是否能够恢复用户的密码(在本特定示例中为123)
这是解密函数
public void DencryptLoginInfo(OfflineLogin loginInfo)
{
byte[] array = aes.Decrypt(loginInfo.SecretShared, loginInfo.Iv);
loginInfo.SecretShared = array;
loginInfo.Iv = (byte[]) null;
}
您是否能够在此实现中发现任何安全问题使用的算法应为AES-256。。您是否能够在python中实现POC来解密给定SecretShared+Iv+Salt的密码?根据您的评论,您的目标是对用户进行身份验证。为此,我们在密码上使用密码基密钥派生函数。通常人们将其称为“散列密码”,这是一个不幸的术语,因为“散列”可能意味着任何东西。但主要的一点是,我们不加密密码,而是通过一个单向函数发送密码,该函数设计得很慢。慢速可以阻止暴力攻击 这样做不需要静脉注射。相反,你的应用程序应该派生一个salt,并使用基于密码的密钥派生函数(有时称为“密码哈希”算法:你必须原谅业界把这个主题的术语弄得一团糟)。你可以在网上找到这方面的指导。但我建议您阅读一下,看看在实现这一点时常见的陷阱 不要使用openssl将密码转换为密钥(或密码哈希)!openssl中的算法是。Openssl的EVP_BytesToKey()无法满足低速的要求,这意味着很容易从密码中强行获取密钥 这个问题的正确解决方案是使用算法,如bcrypt或pbkdf2(不费吹灰之力就可以找到Java实现),从密码中派生出一个“散列”。然后,通过使用用户输入的密码和为该密码存储的salt重新执行相同的计算,验证用户输入的密码是否正确。如果它们匹配,则授予访问权限,否则拒绝访问 请注意,如果此应用程序与服务器交互,通常您会在服务器端进行密码验证。如果你的应用程序没有与服务器交互,那么你可能有充分的理由在设备上进行交互。我不知道你的应用程序做什么,所以我不能告诉你什么是对的或错的
正确执行此操作的一个很好的参考是。您到底想要实现什么?您是通过加密某些东西来验证用户,还是使用用户的密码来加密有用的数据?请记住,堆栈溢出处理与编程相关的问题,这些问题与您的问题不符password@paolino您不应该加密他的密码,而应该使用基于密码的密钥派生函数对其进行哈希运算。好的,请修正你的问题,然后我可以修正我的答案。嗨!我用所需的所有信息更新了问题。非常感谢你的帮助。嗨,greatContini!我用所需的所有信息更新了问题。非常感谢您的帮助。@paolino秘密共享与密码的关系是什么?我也不清楚aes.Decrypt()的API。看起来secretShared正在解密,但我不清楚使用了什么密钥,也不清楚操作模式。回答此问题需要更多信息。密码是否为secretShared?:)这就是我试图回答的问题:)。这些都是从客户那里提取的细节。非常感谢您的帮助我可以尝试回答有关代码的问题,但我不能猜测缺少的代码。