首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Google Tink加密间歇性损坏数据

使用Google Tink加密间歇性损坏数据
EN

Stack Overflow用户
提问于 2021-07-30 14:58:56
回答 1查看 237关注 0票数 2

我正在调查com.google.crypto.tink:tink-android:1.6.1在我目前的安卓项目中的使用情况。

我正在加密的数据包括我为远程OAuth2调用使用的Access /Refresh Token,例如,Access Token是Authorisation的持有者令牌。

我担心我在加密/解密逻辑中犯了一个错误,因为我遇到了一个间歇性问题,我无法刷新令牌。来自服务器的错误

代码语言:javascript
复制
{"error_description":"unknown, invalid, or expired refresh token","error":"invalid_grant"}

刷新令牌不能过期,因为它持续24小时。

我初始化Tink的代码类似于:

代码语言:javascript
复制
private fun manageTink() {
    try {
        AeadConfig.register()
        authenticatedEncryption = generateNewKeysetHandle().getPrimitive(Aead::class.java)
    } catch (e: GeneralSecurityException) {
        throw RuntimeException(e)
    } catch (e: IOException) {
        throw RuntimeException(e)
    }
}

@Throws(IOException::class, GeneralSecurityException::class)
private fun generateNewKeysetHandle(): KeysetHandle =
    AndroidKeysetManager
        .Builder()
        .withSharedPref(this, TINK_KEYSET_NAME, PREF_FILE_NAME)
        .withKeyTemplate(KeyTemplates.get("AES256_GCM"))
        .withMasterKeyUri(MASTER_KEY_URI)
        .build()
        .keysetHandle

下面是我的加密/解密代码

代码语言:javascript
复制
import android.util.Base64
import com.google.crypto.tink.Aead
import javax.inject.Inject

const val BASE64_ENCODE_SETTINGS = Base64.NO_WRAP or Base64.NO_PADDING

data class Security @Inject constructor(private val authenticatedEncryption: Aead) {

    fun conceal(plainText: String, associatedData: String): String {
        val plain64 = Base64.encode(plainText.encodeToByteArray(), BASE64_ENCODE_SETTINGS)
        val associated64 = Base64.encode(associatedData.encodeToByteArray(), BASE64_ENCODE_SETTINGS)
        val encrypted: ByteArray? = authenticatedEncryption.encrypt(plain64, associated64)

        return Base64.encodeToString(encrypted, BASE64_ENCODE_SETTINGS)
    }

    fun reveal(encrypted64: String, associatedData: String): String {
        val encrypted = Base64.decode(encrypted64.encodeToByteArray(), BASE64_ENCODE_SETTINGS)
        val associated64 = Base64.encode(associatedData.encodeToByteArray(), BASE64_ENCODE_SETTINGS)
        val decrypted: ByteArray? = authenticatedEncryption.decrypt(encrypted, associated64)

        return String(Base64.decode(decrypted, BASE64_ENCODE_SETTINGS))
    }
}

Base64编码/解码的使用会是问题所在吗?我的错误在哪里?

EN

回答 1

Stack Overflow用户

发布于 2021-09-29 23:58:56

如果Tink可以解密您的令牌,那么问题应该出在您的令牌/编码上,而不是Tink (它使用的是经过身份验证的加密,因此可以保证您加密的字节将是您解密的字节,否则您会得到一个错误)。

为了解决评论中的问题: Tink将愉快地加密和解密任何字节字符串(相关数据也被允许为任何字节字符串),而不关心它们是否可打印,甚至是有效的Unicode。但是,如果你想将Tink的输出作为字符串使用,你必须对它进行base64编码,因为它将是均匀随机分布的字节,即包含无效的Unicode和高概率不可打印的字符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68593094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档