我正在创建一个网站,每个新用户创建(这就是我现在正在做的)将有一个auth-key
生成,这是在Base64 encoding
。auth-key
很重要,因为几乎所有执行的操作都需要用户的auth-key
。当我阅读这篇关于Base64-Padding
的文章并创建了几个或多或少具有相同unique-name
的用户时,问题就开始了(加密是使用创建用户的unique-name
和LocalDateTime
完成的)。我看到生成的密钥都非常相似。然后我又查阅了一些资料,发现它非常容易解码。
自从我一直在想如果我使用Base64 encoding
,我所面临的安全漏洞是什么?情况有多糟?网站有多脆弱等等?
除了上面的问题,我想知道什么时候我应该使用Base64编码,什么时候我不应该?如果不是Base64
,我应该用什么呢?
注意:我在Java中生成auth-key
,加密在AES
中。谢谢你。
在安全性方面,Base64的使用不是对要保密的字符串进行加密,而是对进行编码。
例如,在基本身份验证中,编码的目的是将用户名、密码或令牌中的非http兼容字符编码为http兼容的字符。
编码不提供任何机密性,因此需要对字符串进行加密。
可以把加密想象成安全位,而编码是使字符串与HTTP很好地配合。
生成令牌的常用方法是先对其加密,然后对其编码。
正如你所给出的文章的第一行所说:
Base64是一组类似的二进制到文本编码方案通过将二进制数据转换成ASCII字符串格式表示二进制数据基数64表示。
由于Base64编码可以很容易地逆转(它已经为此设计),因此很容易突破您的身份验证。您不应该考虑使用Base64编码或任何密码加密,而应该使用MD5、SHA或其他哈希算法,因为从理论上讲,它们是不可逆转且唯一的。下面是MD5的一个例子:
public byte[] digestAuthKey(String login, Date d) {
MessageDigest md = MessageDigest.getInstance("MD5");
String key = login + SALT + d.getTime();
return md.digest(key.getBytes());
}
SALT内容是一个随机生成的字符串,它增强了安全性,使其更难被破坏。要将字节数组转换为字符串,请参阅本文