Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
Encryption AES-256最佳实践实施_Encryption_Aes - Fatal编程技术网

Encryption AES-256最佳实践实施

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

我正在反转一个应用程序,但我不是AES算法的专家。 应用程序为用户提供了离线登录的机会

要求用户提供其用户名密码

这是用于存储用户信息的函数

    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?:)这就是我试图回答的问题:)。这些都是从客户那里提取的细节。非常感谢您的帮助我可以尝试回答有关代码的问题,但我不能猜测缺少的代码。