【问题标题】:How can I encrypte my password - Android Studio如何加密我的密码 - Android Studio
【发布时间】:2017-05-04 14:01:27
【问题描述】:

有人知道如何加密用户添加到密码字段中的密码吗?

我尝试了本教程,但没有成功。

https://gist.github.com/aogilvie/6267013#file-string_encrypt_decrypt-md

我希望有人可以帮助我:(

【问题讨论】:

  • 不要加密密码,当攻击者得到数据库时,他也会得到加密密钥。使用随机盐在 HMAC 上迭代大约 100 毫秒,然后将盐与哈希一起保存。使用password_hash/password_verifyPBKDF2(又名Rfc2898DeriveBytes)、Bcrypt 等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。

标签: android android-studio encryption passwords


【解决方案1】:
public class AESCrypt
{
    private static final String ALGORITHM = "AES";
    private static final String KEY = "1Hbfh667adfDEJ78";

    public static String encrypt(String value) throws Exception
    {
        Key key = generateKey();
        Cipher cipher = Cipher.getInstance(AESCrypt.ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte [] encryptedByteValue = cipher.doFinal(value.getBytes("utf-8"));
        String encryptedValue64 = Base64.encodeToString(encryptedByteValue, Base64.DEFAULT);
        return encryptedValue64;

    }

    public static String decrypt(String value) throws Exception
    {
        Key key = generateKey();
        Cipher cipher = Cipher.getInstance(AESCrypt.ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedValue64 = Base64.decode(value, Base64.DEFAULT);
        byte [] decryptedByteValue = cipher.doFinal(decryptedValue64);
        String decryptedValue = new String(decryptedByteValue,"utf-8");
        return decryptedValue;

    }

    private static Key generateKey() throws Exception
    {
        Key key = new SecretKeySpec(AESCrypt.KEY.getBytes(),AESCrypt.ALGORITHM);
        return key;
    }
}

使用它会解决你的问题。

【讨论】:

  • 仅指定加密算法 ("AES") 而不指定模式和填充是不完整的,并将这些默认值留给特定的实现。应该提供所有三个,例如“AES/CBC/PKCS5Padding”。看来这个答案是使用 ECB 模式和 PKCS5Padding 但这只是阅读代码的猜测。
  • 不要使用 ECB 模式,它不安全,请参阅ECB mode,向下滚动到企鹅。而是使用随机 IV 的 CBC 模式,只需在加密数据前加上 IV 以用于解密。
  • 应该改用哈希
【解决方案2】:

引用这篇文章Difference between Hashing a Password and Encrypting it 我建议您使用散列(不加密)来存储密码。您可以使用即 md5(不推荐)、sha1、sha2...

SHA1 的示例实现:How to SHA1 hash a string in Android?

【讨论】:

【解决方案3】:

这是有史以来最简单的普通加密解决方案。 首先,将其添加到您的构建 gradle 文件中:

    implementation 'com.scottyab:aescrypt:0.0.1'

然后使用下面的代码进行加解密:

// To Encrypt
String password = "password";
String message = "hello world";	
try {
    String encryptedMsg = AESCrypt.encrypt(password, message);
}catch (GeneralSecurityException e){
    //handle error
}

// To Decrypt
String password = "password";
String encryptedMsg = "2B22cS3UC5s35WBihLBo8w==";
try {
    String messageAfterDecrypt = AESCrypt.decrypt(password, encryptedMsg);
}catch (GeneralSecurityException e){
     //handle error - could be due to incorrect password or tampered encryptedMsg
}

【讨论】:

  • 我不明白人们为什么要解密密码!?我的理解是您选择了一种强大的、可重复的加密方法,并且为了验证,您对给定的密码进行加密并将结果与​​您保存的内容进行比较。如果密码是可恢复的,则提供商知道您的密码。我不想那样。
  • @cslotty 在某些情况下这是非常需要的;一个典型的例子是 Android WebView 中的 GET 请求,其中凭据(或某些值)很容易使用 URL 而不是 POST 传递。在服务器端加密和解密是有意义的。此后是您开始正常的单向哈希
  • @Ajowi - 嗯,密码通常只加密一次,那是它们被创建的时候。之后,他们将永远不会被解密。它们以加密方式保存在服务器端,您在客户端使用相同的加密。然后对用户输入进行加密,并与服务器端的加密值进行比较。我们不是在谈论密码以外的值,它们是另一回事!
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2014-04-20
  • 2017-11-09
  • 1970-01-01
  • 2016-09-28
  • 2018-04-06
  • 2016-06-12
  • 2020-10-31
相关资源
最近更新 更多