字符串到byte [],具有已定义的大小

时间:2017-08-29 18:41:02

标签: java android arrays encryption realm

我要做的是将字符串转换为字节[] ,但我需要字节[] 尺寸 总是 64字节,与输入中的字符串无关,以便与 Realm加密一起使用,但经过一些研究后我无法做到找到类似的东西,还是有其他方法我可以使用字符串作为Realm加密?

这是我的代码:

public class MainActivity extends AppCompatActivity {

    static final int REQUEST_VIDEO_CAPTURE = 1;
    VideoView resultvideo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button click = (Button)findViewById(R.id.videorec);
        resultvideo = (VideoView)findViewById(R.id.videoView);
    }

    public void dispatchTakeVideoIntent(View v) {
        Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
            Uri videoUri = data.getData();
            resultvideo.setVideoURI(videoUri);

            resultvideo.start();

        }
    }
}

这是错误:

  

java.lang.IllegalArgumentException:提供的密钥必须是64个字节。   你的是:17

3 个答案:

答案 0 :(得分:3)

您希望使用Key Derivation Function从用户的密码短语生成加密密钥。最简单的形式是向用户的密码添加一个salt,然后将其提供给SHA-2以获得256位哈希值,但理想情况下,您希望使用类似scrypt的内容来制作它更难以强制使用密码。

答案 1 :(得分:1)

在这里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);

请记住保存盐并将其保存在某处(例如,在“首选项”中)。

答案 2 :(得分:-1)

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

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