nishuihanlong / ltpatoken
domino sso, 生成或解析 ltpatoken。
Requires
- php: >=8.0
This package is auto-updated.
Last update: 2024-09-05 09:29:16 UTC
README
介绍
主要是解析或生成 ltpatoken,php8.1 版本验证通过
LtpaToken 组成原理
通过了解 LtpaToken 的组成原理,我们就可以自己编码生成和解析 LtpaToken 了。首先一个 LtpaToken 的合成公式如下:
[token] = BASE64([header][creation time][expiration time][username][SHA-1 hash])
解释:
Header: LtpaToken 版本(长度4),Domino 的固定为 [0x00][0x01][0x02][0x03]
Creation time: 创建时间戳(长度8),格式为 Unix time 比如如 [2010-03-12 00:21:49] 为 4B99189D
expiration time:过期时间戳(长度8) 同上
username: 用户名(长度不定)
SHA-1 hash:SHA-1 校验和(长度20)
如下图:
上面的 SHA-1 校验和,又是由前面所说的密钥和其余的 Token 资料合并而成,合成公式如下:
[SHA-1 hash] = SHA-1([header][creation time][expiration time][username][shared secret])
解释:
shared secret: 共享密钥,使用时需要先经过 Base64 解码,再参与计算。
校验和的计算规则如下图:
所以,如果有人篡改了 Token,那校验和就与修改后的 Token 不匹配了,这样 Token 一旦生成,有人想要修改它的信息,比如改成别的用户名,是不可能的。
注意
1. token 是否被篡改
2. token 是否已经过期
3. 从 token 中获取用户登录名
用法
use Nishuihanlong\Ltpatoken;
$ltpatoken = new Ltpatoken();
//$secretKey为密钥
$token = $ltpatoken->genToken($secretKey);
//$cookie为获取到的cookie
$userName = $ltpatoken->parseToken($cookie);