Session Transformers

预计阅读时间:5分钟

目录:

Standard Transformers

SessionTransportTransformerDigest

SessionTransportTransformerEncrypt提供了一个会话传输转换器,其中包括带有盐的有效负载的哈希值并进行验证. 它使用SHA-256作为默认的哈希算法,但是可以更改. 它不会加密有效载荷,但是仍然没有盐,人们不应该能够更改它.

// REMEMBER! Change this string and store them safely
val salt = "my unity salt string"
cookie<TestUserSession>(cookieName) {
    transform(SessionTransportTransformerDigest(salt))
}

使用此模式时,可以将会话的实际内容作为cookie或标头以及原始或转换的形式发送给客户端.

这种模式被认为是"无服务器的",因为您不需要在服务器端存储任何内容,而存储和保留该会话只是客户端的责任. 这样可以简化后端,但是要了解以这种模式工作的安全隐患.

在这种模式下,您只需在install(Sessions)块内使用带有cookie或标题名称的单个参数调用headercookie方法.

headercookie块中,您可以选择调用transform方法,该方法允许您转换发送的值,例如对它进行身份验证或加密.

install(Sessions) {
    val secretHashKey = hex("6819b57a326945c1968f45236589")

    cookie<SampleSession>("SESSION_FEATURE_SESSION") {
        cookie.path = "/"
        transform(SessionTransportTransformerMessageAuthentication(secretHashKey, "HmacSHA256"))
    }
}
  • 为会话提供服务而无需进行转换,使人们可以清楚地看到会话的内容,然后进行修改.
  • 通过Authentication转换为会话提供服务意味着人们可以看到其中的内容,但是只要您保持秘密哈希密钥的安全并使用安全算法,就可以防止他们对其进行修改. 也可以使用旧的会话字符串返回到先前的状态.
  • 使用Encrypt转换为会话提供服务可防止人们确定实际内容并对其进行修改,但是它仍然易于受到利用并返回到以前的状态.

可以存储时间戳或随机数加密和认证,但是您必须限制会话时间或在服务器上进行验证,从而降低了此模式的好处.

因此,根据经验,只有在人们可以使用旧的会话状态不涉及安​​全性的情况下,才可以使用此模式. 并且,如果您正在使用会话登录用户,请确保至少要使用transform对会话进行身份验证 ,否则人们将能够轻松访问其他人的内容.

还请记住,如果您的安全密钥遭到破坏,则拥有该密钥的人将能够生成任何会话有效负载,并可能冒充任何人.

It is important to note that changing the key will invalidate all the sessions from all the users.

SessionTransportTransformerMessageAuthentication

SessionTransportTransformerMessageAuthentication提供了一个会话传输转换器,其中包含经过身份验证的有效负载哈希并对其进行验证. 它类似于SessionTransportTransformerDigest,但使用HMAC. 它使用HmacSHA265作为默认身份验证算法,但是可以更改. 它不会对有效载荷进行加密,但是仍然没有密钥,人们不应该能够对其进行更改.

// REMEMBER! Change this string and store them safely
val key = hex("03515606058610610561058")
cookie<TestUserSession>(cookieName) {
    transform(SessionTransportTransformerMessageAuthentication(key))
}

SessionTransportTransformerEncrypt

SessionTransportTransformerEncrypt提供了一个会话传输转换器,用于加密有效负载并对其进行身份验证. 默认情况下,它使用AESHmacSHA256 ,但是您可以对其进行配置. 它需要一个加密密钥和一个身份验证密钥,其大小与算法兼容:

// REMEMBER! Change ALL the digits in those hex numbers and store them safely
val secretEncryptKey = hex("00112233445566778899aabbccddeeff") 
val secretAuthKey = hex("02030405060708090a0b0c")
cookie<TestUserSession>(cookieName) {
    transform(SessionTransportTransformerEncrypt(secretEncryptKey, secretAuthKey))
}

Custom transport transformers

Sessions API提供了一个SessionTransportTransformer接口,如下所示:

interface SessionTransportTransformer {
    fun transformRead(transportValue: String): String?
    fun transformWrite(transportValue: String): String
}

您可以使用这些转换来加密,认证或转换有效载荷. 您必须实现该接口并像往常一样添加转换器:

cookie<MySession>("NAME") {
    transform(MtSessionTransformer)
}

SessionTransportTransformer允许转换沿请求传输的值. 由于它是可组合的,因此可以输入传输的值或对其进行转换. 它由两种方法组成:一种应用转换( transformWrite ),另一种将不应用transformReadtransformRead ). 在两种情况下,输入和输出均为字符串. 通常, transformWrite应该总是可以工作,而如果输入格式错误或无效,则transformRead可能会失败,在这种情况下,它将返回null.

interface SessionTransportTransformer {
    fun transformRead(transportValue: String): String?
    fun transformWrite(transportValue: String): String
}

by  ICOPY.SITE