我想在我的一些网址参数中添加一种简单的MAC。这仅旨在作为针对应用程序错误和缓存相关问题/错误的额外防线,而不是用于替换应用程序中的实际登录安全性的任何形式。给定的business-object-id已受后端保护,仅限于单个用户。
所以基本上我想在我的url参数中添加一个简短的身份验证代码,大小为2-4个字符。我想我希望在f(business-data-id + logged-on-user-id + ??)= hash方面有一个可逆功能,但我愿意接受建议。
主要目的是阻止id猜测,并确保每个登录用户的url是相当明显的。我也不想要像MD5一样大而笨重的东西。
答案 0 :(得分:2)
由于您不是在寻找加密质量,因此24位CRC可能符合您的需求。虽然MD5在绝对意义上是“快速的”,但CRC相对来说“非常快”。然后,可以使用Base-64编码将3字节CRC文本编码为四个字符。
这是用于OpenPGP ASCII-armor校验和的检查的Java实现:
private static byte[] crc(byte[] data)
{
int crc = 0xB704CE;
for (int octets = 0; octets < data.length; ++octets) {
crc ^= (data[octets] & 0xFF) << 16;
for (int i = 0; i < 8; ++i) {
crc <<= 1;
if ((crc & 0x1000000) != 0)
crc ^= 0x1864CFB;
}
}
byte[] b = new byte[3];
for (int shift = 16, idx = 0; shift >= 0; shift -= 8) {
b[idx++] = (byte) (crc >>> shift);
}
return b;
}
我会将一个秘密密钥(只有服务器知道)与您想要保护的密钥一起散列 - 可能是对象标识符和用户标识符的组合。
答案 1 :(得分:1)
如果您想要的基本上是MD5但更小,为什么不只是使用MD5而只是最后4个字符?这不会给你的网址添加一个巨大的blob,它总是4个漂亮的十六进制数字。
答案 2 :(得分:0)
我确信这是一个很好的答案的快速问题,但为什么不将这些信息存储在cookie中呢?
然后你可以像MD5一样使用大而笨重的东西,你的网址仍然很漂亮。