【问题标题】:String to byte[] with a defined size具有定义大小的字符串到字节 []
【发布时间】:2017-08-29 18:41:02
【问题描述】:

我要做的是将String 转换为byte[],但我需要字节[] 大小64 字节 始终与输入中的字符串无关,以便与 Realm 加密一起使用。但是,经过一番研究,我找不到类似的东西,或者有没有其他方法可以使用字符串作为 Realm 加密?

这是我的代码:

String passphrase = "ASDYB982234235512";
byte[] key = passphrase.getBytes();
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder()
                .encryptionKey(key)
                .build();

这是错误:

java.lang.IllegalArgumentException: The provided key must be 64 bytes. Yours was: 17

【问题讨论】:

  • 您在寻找哈希函数吗?如果字符串长度超过 64 个字节,您希望发生什么?
  • 我正在寻找一种将字符串用于 Realm 加密的方法,如果它大于 64,则不允许使用该字符串,但如果它更短,请以某种方式用相同的字符串填充空白以保持一致性
  • 如果输入字符串的长度小于 64 字节且必须为 64 字节,则必须有人(可能是奥巴马)填写输入,直到长度为 64 字节。

标签: java android arrays encryption realm


【解决方案1】:

您想使用Key Derivation Function 从用户的密码生成加密密钥。最简单的形式是在用户的密码中添加盐,然后将其输入 SHA-2 以获得 256 位哈希,但理想情况下,您希望使用 scrypt 之类的东西来使其更难暴力破解密码。

【讨论】:

    【解决方案2】:

    在这里https://android-developers.googleblog.com/2013/02/using-cryptography-to-store-credentials.html你可以找到你可以使用的功能(我只是改变了密钥大小):

    public static SecretKey generateKey(char[] passphraseOrPin, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
        // Number of PBKDF2 hardening rounds to use. Larger values increase
        // computation time. You should select a value that causes computation
        // to take >100ms.
        final int iterations = 1000; 
    
        // Generate a 512-bit key
        final int outputKeyLength = 512;
    
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec keySpec = new PBEKeySpec(passphraseOrPin, salt, iterations, outputKeyLength);
        SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
        return secretKey;
    }
    

    然后使用secretKey.getEncoded()

    生成盐:

    final Random secureRandom = new SecureRandom();
    byte[] salt = new byte[32];
    secureRandom.nextBytes(salt);
    

    记得保存盐并将其保存在某个地方(例如在首选项中)。

    【讨论】:

      【解决方案3】:

      尝试使用 Base64.encode 对字符串进行编码,我猜输出对你有用。

      或者尝试使用包含 64 个字符的字符串,您当前的密码包含 17 个字符

      【讨论】:

      • 已经尝试编码为 Base64 不幸的是它没有填满 64 字节,而且我不能使用硬编码字符串,因为每个用户的加密字符串都会动态变化
      • 您是否在通过 base 64 编码时删除了 == 形式的额外填充尝试使用 base64 编码并仅使用文本并保留 == 部分或在编码时使用 NO_PADDING 标志跨度>
      猜你喜欢
      • 2020-08-21
      • 2017-04-22
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      相关资源
      最近更新 更多