Java 将tomcat会话id更改为包含大写和小写字符
我有一个要求,需要确保Tomcat生成的会话id格式应该包括大写、小写字符和0-9。 我检查了Tomcat的源代码。 \org\apache\catalina\util\StandardSessionIdGenerator.java 在方法publicstringgenerateSessionId(stringroute)中 有几行代码可以将字节转换为十六进制数字的字符串,如下所示:Java 将tomcat会话id更改为包含大写和小写字符,java,session,tomcat,Java,Session,Tomcat,我有一个要求,需要确保Tomcat生成的会话id格式应该包括大写、小写字符和0-9。 我检查了Tomcat的源代码。 \org\apache\catalina\util\StandardSessionIdGenerator.java 在方法publicstringgenerateSessionId(stringroute)中 有几行代码可以将字节转换为十六进制数字的字符串,如下所示: byte b1 = (byte) ((random[j] & 0xf0) >> 4); by
byte b1 = (byte) ((random[j] & 0xf0) >> 4);
byte b2 = (byte) (random[j] & 0x0f);
if (b1 < 10)
buffer.append((char) ('0' + b1));
else
buffer.append((char) ('A' + (b1 - 10)));
if (b2 < 10)
buffer.append((char) ('0' + b2));
else
buffer.append((char) ('A' + (b2 - 10)));
byte b1=(byte)((random[j]&0xf0)>>4);
字节b2=(字节)(随机[j]&0x0f);
如果(b1<10)
append((char)('0'+b1));
其他的
append((char)('A'+(b1-10));
如果(b2<10)
append((char)('0'+b2));
其他的
append((char)('A'+(b2-10));
看起来,将大写字母“A”更改为“A”时,我可以实现我的目标。(目标是生成的会话id将同时包含A-Z、A-Z和0-9)
更改后生成的会话id:
6B95cDf17411a9555D0E42d99C8E0292
这是一个简单有效的改变,还是你看到了任何潜在的问题
谢谢。这听起来像是一种非常奇怪的要求——这里重要的是底层会话ID的长度,而不是它的编码方式(像这样的随机ID和用户选择的密码之间有区别)。如果Tomcat生成的会话ID:s被认为不够安全,那么最好的选择可能是提高参数的值
话虽如此,如果您真的需要生成自己的ID,那么定制的
org.apache.catalina.SessionIdGenerator
(可能扩展标准SessionIdGenerator
)将是一个不错的选择。感谢您的宝贵想法。但由于某种原因,要求生成的ID应该是该格式,当然,要求还要求长度和字节长度。Tomcat默认生成的会话id是这部分的投诉,只有格式需要调整。我提到的要求[link]仍然是一个不好的要求-id不是通过随机选取字符生成的(在这种情况下是有意义的),而是随机选取一定数量的字节,然后进行编码。当然,有时我们也需要遵守一些不好的要求。Tomcat的会话id是首先获取SecureRandom,然后将十六进制数字编码为字符串。我认为它是安全的。最初的问题是,如果我们通过使用这种方法(像我提到的那样稍微修改一下)来更改它,使最终编码的字符串包含上限/下限/数字,那么它会导致任何问题吗?只要生成的字符串可以包含在URL中而不转义(建议的更改仍然允许),我无法想象任何问题。您不会增加安全性,但会遵守要求(至少有一定的可能性-您当然可能最终生成一个只包含大写或小写字符的ID,但可能性很低)。我只是为了好玩而做了一个测试,在1000000次尝试中,大约9994600次同时包含了一个大写和小写字符。