我要做的是将字符串转换为字节[] ,但我需要字节[] 尺寸 总是 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
答案 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个字符