什么是KeyStore?KeyStore加解密详解

在许多密码学应用中,用户安全最终取决于密码,并且由于密码通常不能直接用作密码密钥,因此需要进行一些处理,KeyStore正是在这种背景下孕育而生。KeyStore是基于用户的密码的和待加密的信息生成的一段JSON。KeyStore存储是目前区块链行业的共识和规范,被众多主流链如BTC,ETH规范认可。大部分区块链钱包采用的存储办法是KeyStore存储形式,如Binance DEX和TrustWallet等等钱包。

KeyStore存储具有以下特点

  1. 可校验;只有唯一的密码可以解密获得加密的信息
  2. 不可串改;KeyStore的加密部分,只要被修改了值将无法获得原始的加密信息,甚至不能通过密码校验
  3. 破解难度大;加解密需要通过层层哈希算法和千万次推导和加解密算法,每一次加解密都要耗时2-5秒左右,让暴力破解成为不可能的事情

 

KeyStore是怎么生成?又是怎么解密的呢?首先先看KeyStore的基本构成:


{
    "crypto" : {
        "cipher" : "aes-128-ctr",
        "cipherparams" : {
            "iv" : "6087dab2f9fdbbfaddc31a909735c1e6"
        },
        "ciphertext" : "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46",
        "kdf" : "pbkdf2",
        "kdfparams" : {
            "c" : 262144,
            "dklen" : 32,
            "prf" : "hmac-sha256",
            "salt" : "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"
        },
        "mac" : "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"
    },
    "id" : "3198bc9c-6672-5ab3-d995-4942343ae5b6",
    "version" : 3
}

它包含了三部分信息

crypto

KeyStore加密信息的核心,接下来主要说明这一块的内容。

id

这个KeyStore的唯一ID。对于加解密并无关联

version

版本号。对于加解密并无关联

KeyStore的核心crypto

cipher

使用的加密算法;aes-128-ctr是一种加密算法,它的参数是:用户密码、待加密信息、iv、中间秘钥

cipherparams

加密的参数;iv是一般是一个随机的32位的十六进制字符串

ciphertext

加密的结果;待加密信息和用户密码通过一系列加密算法,最终生成的就是这样的一个十六进制字符串。我们的解密最终

kdf

基于用户密码的算法,通过密码和参数kdfparams,产生中间秘钥,这个中间秘钥将用于生成mac和ciphertext。一般用到的算法是:pbkdf2或scrypt

kdfparams

kdf算法的参数

c: 算法加密次数,越高越安全,但同时也更耗时间和性能。

dklen: 生成中间秘钥的字节数

prf: 哈希算法

salt: 一般是一个随机的32位的十六进制字符串

mac

用于验证密码的正确及验证ciphertext是否原装未经过修改;它通过产生的中间秘钥ciphertext,经过SHA3哈希算法最终得到。

下面是它们的推导过程和联系

上述KeyStore的密码和待加密的信息如下:

  • 密码:testpassword
  • 待加密的信息(这里是一个私钥):7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d

那么它的推导信息如下:

  • Derived key(中间秘钥): f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551
  • MAC Body: e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46
  • MAC: 517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2
  • Cipher key: f06d69cdc7da0faffb1008270bca38f5

相关文档:

Web3 Secret Storage Definition: https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition

原文来自本人GitHub博客:https://www.yanglidong.com/what-is-keystore/



 

Winter2020/03/10 20:59:31

伟大的***