哇,这样的用户,非常多!
1000 * 100
是很多会话cookie。// Secret 128 bytes array.
const ByteArray serverMagic;
// Generates a SHA512 hash based on data.
function hash(ByteArray data);
// Encodes array of bytes into base64 string.
function base64(ByteArray data);
// Returns current time on the server.
function getCurrentDate();
// Returns userMagic based on the user ID.
function getUserMagic(Integer uid);
// Returns true if user entered wrong password.
function isLoginInvalid(Integer uid, String password);
function Object.toShortString(); // Encodes an object into a short ASCII string.
const Integer uid; // User ID.
var String password; // Secret code that gives you all of that damn power.
var ByteArray userMagic // Secret 128 bytes array.
function logIn(Date expire, Integer uid, String password) {
if(isLoginInvalid(uid, password)) then
return error;
String encExpire = expire.toShortString();
String encUID = uid.toShortString();
ByteArray userMagic = getUserMagic(uid);
ByteArray food = encExpire + '_' + serverMagic + userMagic + '_' + encUID;
ByteArray hash = hash(food);
String session = encExpire + '_' + encUID + '_' + base64(hash);
return session;
}
客户端将保存该会话cookie。
他将会话cookie发送到服务器。
// After parsing session cookie
function request(Date sessionExpire, Integer uid, ByteArray sessionHash) {
if(sessionExpire < getCurrentDate()) then
return error;
String encExpire = sessionExpire.toShortString();
String encUID = uid.toShortString();
ByteArray userMagic = getUserMagic(uid);
ByteArray food = encExpire + '_' + serverMagic + userMagic + '_' + encUID;
ByteArray hash = hash(food);
if(hash == sessionHash) then
return success;
else
return error;
}
由于设备丢失或密码更改,服务器只能生成新的userMagic
,这会使以前的所有会话cookie无效。
答案 0 :(得分:0)
像这样的解决方案的问题是它们经常容易受到非常微妙的错误的攻击,例如length extension attacks。保持安全,然后使用HMAC。
仅供参考.Net有一些与此不同的构造,但使用HMAC并且没有用户魔力。
任何用户都可以计算:
String session = encExpire + '_' + encUID + '_' + base64(hash);
这意味着任何用户都可以创建任意会话。黑客将使用设置为管理员uid的encUID来执行此操作,该管理员可以是1或0或类似的东西。
我可能会建议使用带有密钥的HMAC修复此错误,但您真的不应该自己实现这个。找到一个广泛使用且经过充分研究的库,为您进行会话管理,而不是试图重新发明轮子。