如果输入键小于16字节怎么办?我找到了解决办法,但这不是最佳做法。
//hashing here act as padding because any input given, it will generate fixed 20 bytes long.
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
//trim the code to only 16 bytes.
key = Arrays.copyOf(key, 16);
我不打算用盐,因为在我的项目中它是不必要的。有没有更好的办法?
2条答案
按热度按时间bzzcjhmw1#
有三种方法:
把键移到16个字节。你可以使用任何你想要的值作为填充,只要你始终如一。
你使用sha-1散列的方案是可以的。如果可以使用散列中的所有位作为密钥,那就更好了,但是128位应该足够了。
告诉用户密钥至少需要n个字符。太短的密钥可能容易受到密码猜测攻击(一个15个字符的密钥可能太长,无法猜测,但是8个字符是可以处理的。)事实上,您可能应该做一些其他的密码质量检查。
我的建议是合并1。或2。与3。。。密码质量检查。
我不相信种子散列将有很大的不同(我假设坏人能够检查你的文件加密应用程序,并找出如何将密码转换为密钥。)种子植入意味着坏人无法为普通/弱密码预先生成一组候选密钥,但他仍然需要依次尝试生成的每个密钥。
但另一方面,如果你开始使用的密码很弱,那么使用加密散列也没有帮助。
d5vmydt92#
不要混淆钥匙和密码。键是随机生成的,可以由任何可能的字节值组成。另一方面,密码需要由人输入,而且通常是可以记住的。如果密钥太短,则向用户发出错误或将其视为密码。
然后只能以编码格式(如十六进制或base64)输入密钥。只有在成功解码时才检查长度。
一个密码有各种各样的问题,使它可以强制执行,如短长度或低复杂性。在那里,您需要使用基于密码的密钥派生函数(如pbkdf2)和足够大的工作因子(迭代),以便使单个密钥派生尝试的速度非常慢,以至于攻击者需要更多的时间来检查整个输入空间。
您应该将其与一些消息结合起来,向用户提示密码太短或不包含某些字符类,因此不建议使用。