【发布时间】:2018-02-11 16:37:30
【问题描述】:
基本信息
- 我有一个网络服务器,里面有所有花哨的东西。
- 它在我的半土豆 PC 上运行,所以我没有任何可用的 64TB SSD 存储空间。
- 我必须关心可扩展性,因为有一天我可能有 1000 个用户。
哇,这样的用户,非常多!
- 如果用户丢失他的设备,我不希望任何密码被盗。所以我决定使用会话。
- 我不想存储所有用户会话,因为这可能是 100 台设备。所以
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.
逻辑
如果用户想登录
他将发送:
- 会话到期日期(因此 cookie 在所需时间后将失效)
- 用户 ID
- 密码(或者密码的哈希,没关系)
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,这将使之前的所有会话cookies无效。
问题
- 不存储会话是
存储的好方法吗? - 我的系统是否存在缺陷?
- 能破解吗?
- 又如何破解?
- 怎么会被滥用?
- 如何改进我的系统?
【问题讨论】:
标签: security session cookies hash backend