【问题标题】:Password encryption using google/tink使用 google/tink 进行密码加密
【发布时间】:2018-05-08 09:27:45
【问题描述】:

美好的一天,我已使用 google/tink 来加密密码,以便使用以下步骤存储在数据库中:

// 1. Generate the key material.
KeysetHandle keysetHandle = 
    KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM);

// 2. Get the primitive.
Aead aead = AeadFactory.getPrimitive(keysetHandle);

// 3. Use the primitive to encrypt a plaintext,
byte[] ciphertext = aead.encrypt(plaintext, aad);

它基本上将密码转换为字节,但是当我将其转换为字符串存储到数据库中时,它以这种格式存储加密的密码:-�@~�k�D߶{׼�

但我想使用 tink 加密以11As7737Cs9ue9oo09 之类的格式存储密码。

有什么办法吗?

【问题讨论】:

  • 查看标签。在设计合理的安全系统中没有密码加密之类的东西。
  • 不要加密密码,当攻击者得到数据库时,他也会得到加密密钥。仅使用散列函数是不够的,仅添加盐对提高安全性无济于事。使用随机盐在 HMAC 上迭代大约 100 毫秒,然后将盐与哈希一起保存。使用PBKDF2Rfc2898DeriveBytesArgon2password_hashBcrypt 等函数或类似函数。关键是让攻击者花费大量时间通过蛮力查找密码。
  • @zaph 感谢您的建议,一定会这样做

标签: java password-encryption tink


【解决方案1】:

Manish,您可能不想加密密码。你想对它们进行哈希处理。 Tink 还不支持密码哈希,但如果有足够的兴趣,我们可以添加支持。

您能否通过https://github.com/google/tink/issues/new 提出功能请求?

【讨论】:

  • 嗨,泰语,tink 支持公钥加密(服务器 - 客户端)吗?
【解决方案2】:

我同意这里的每个人的观点,即您不应该明文存储密码。

但是,要回答您的问题,因为我认为当您获得一些密文并且字符串不可读时,这是一个常见问题。假设您想存储加密且可读的非密码数据。您需要对密文进行 Base64 编码。

当您从数据库中检索回您的 Base64 编码数据时,您需要对字符串进行 Base64 解码,然后在您的解密过程中运行它。以您的示例为基础,

String readable = new String(java.util.Base64.getEncoder().encode(cipherText));

byte[] bytesToDecrypt = java.util.Base64.getDecoder().decode(readable.getBytes());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多