geth中UTC文件与私钥的关系
在创建了自己的本地区块链后,我们会得到一个文件夹keystore,该文件夹是用来存储你在这个区块链中创建的账户的备份钥匙文件,比如在这里我有一个账户的备份钥匙文件为:UTC--2018-07-12T06-48-30.819494813Z--91b678137f09c8b4f294a14e88c09276522618cf(json文件)
{"address":"91b678137f09c8b4f294a14e88c09276522618cf",
"crypto":{
"cipher":"aes-128-ctr",
"ciphertext":"ebd32eef42c403fbe6509a8b5ae5b2d7d4eb15ee1a046ae23c3383ad672f0fcd",
"cipherparams":{
"iv":"0406c84c7a744beb6774214f912327dd"
},
"kdf":"scrypt",
"kdfparams":{
"dklen":,
"n":,
"p":,
"r":,
"salt":"260bebdb9cb810a63d1060f69ebd35a479c77d5fd11a16fb496367359cb99f2a"
},
"mac":"5bb1d0ea80da66265f044f075f5fcf7c736500c75fa1a0d5d52e25f9bceea7a2"
},
"id":"fa03979a-f607-4de9-b32a-4952cc93ca6f",
"version":3
}
cipher:加密算法,对称加密,AES算法,用于加密以太坊私钥; cipherparams:cipher算法需要的参数,参数iv,是aes--ctr加密算法需要的初始化向量; ciphertext:私钥加密后的密文,你的以太坊私钥使用上述 cipher 算法进行加密,这样你的私钥不会是明文存储,aes--ctr函数的解密输入密文;
//所以将ciphertext的密文解密密钥、ciphertext加密后的私钥、cipherparams算法所需的参数 这三者输入到对称算法aes-128-ctr中后,就能够得到私钥了
//然后从上面所需的三个输入中我们就知道我们现在还不知道ciphertext的密文解密密钥是什么,那么下面就是用于生成这个解密的
kdf:秘钥生成函数,用于使用你自己设置的密码加密keystore文件,所以你要用自己的密码解密keystore文件后才能得到私钥
//用 kdfparams 参数对 scrypt 函数进行调整
kdfparams:kdf算法所需要的参数;
//kdf和kdfparams的作用就是生成ciphertext的密文解密密钥,因为我们很难记得这个长串的密钥,所以在这里我们只需要通过这个密钥生成函数scrypt、其参数kdfparams以及自己设置的密码password
//这三者我们就能够得到ciphertext的密文解密密钥,然后将其输入到上面的aes-128-ctr加密算法用于解密ciphertext,我们就能够得到自己的私钥了 //mac的作用是用做一开始输入密码password的时候来判断输入的这个密码是不是正确的,正确的才开始上面解密ciphertext的过程
//就是我们先通过输入的密码、密钥生成函数scrypt及其参数kdfparams三者得到密文解密密钥
//然后使用其左起第二个字节开始的16个字节以及ciphertext连接在一起,并进行哈希散列(用SHA3-256的方法)
//然后将得到的值hash与mac的值做比对,相同才说明输入的密码为该账户设置的密码,mac也是根据上面的步骤得到的
mac:验证密码的编码;
Remarks about toV3
The options
is an optional object hash, where all the serialization parameters can be fine tuned:
- uuid - UUID. One is randomly generated.随机生成
- salt - Random salt for the
kdf
. Size must match the requirements of the KDF (key derivation function). Random number generated viacrypto.getRandomBytes
if nothing is supplied.kdf的随机salt。大小必须符合KDF(key派生函数)的要求。通过密码生成的随机数。如果没有提供任何内容,则为getRandomBytes。 - iv - Initialization vector for the
cipher
. Size must match the requirements of the cipher. Random number generated viacrypto.getRandomBytes
if nothing is supplied.密码的初始化向量。大小必须符合密码的要求。通过密码生成的随机数。如果没有提供任何内容,则为getRandomBytes。 - kdf - The key derivation function, see below.key的推导函数
- dklen - Derived key length. For certain
cipher
settings, this must match the block sizes of those.派生key的长度,对于某些密码设置,这必须与这些设置的块大小匹配 - cipher - The cipher to use. Names must match those of supported by
OpenSSL
, e.g.aes-128-ctr
oraes-128-cbc
.使用密码。名称必须与OpenSSL支持的名称匹配,例如aes-128-ctr或aes-128-cbc。
Depending on the kdf
selected, the following options are available too.
For pbkdf2
:
c
- Number of iterations. Defaults to 262144.迭代次数prf
- The only supported (and default) value ishmac-sha256
. So no point changing it.唯一支持的(也是默认的)值是hmac_sha256。所以没有必要改变它。
For scrypt
:
n
- Iteration count. Defaults to 262144.迭代次数r
- Block size for the underlying hash. Defaults to 8.底层哈希的块大小。默认为8。p
- Parallelization factor. Defaults to 1.并行化的因素。默认为1。
The following settings are favoured by the Go Ethereum implementation and we default to the same:
下面的设置是Go Ethereum实现支持的,我们默认的设置也是如此
kdf
:scrypt
dklen
:32
n
:262144
r
:8
p
:1
cipher
:aes-128-ctr
所以我们总结上面的过程,我们就知道该钥匙文件的使用过程为:
首先,你输入了密码password,这个密码将作为 kdf 密钥生成函数的输入,来计算密文解密密钥。
然后,将密文解密密钥和 ciphertext 密文连接并进行处理,和 mac 比较来确保密码是正确的。
最后,通过 cipher 对称函数用密文解密密钥对 ciphertext 密文解密,得到私钥
钥匙文件的文件名格式为UTC。账号列出时是按字母顺序排列,但是由于时间戳格式,实际上它是按创建顺序排列。
所以,在整个过程中你的密码是惟一的输入,你的以太坊私钥是惟一的输出。所需的其他信息都可以在你的以太坊账户创建时生成的keystore文件中获得。
所以一定要确保你的密码足够强,这样能保证即使有人得到了你的keystore文件,它也无法获得你的私钥。
想了解scrypt可看:
https://tools.ietf.org/html/rfc7914
https://zhuanlan.zhihu.com/p/32484253
私钥、公钥、地址之间的关系:
每个账户都由一对密钥来定义,包括公钥和私钥。我们通过自己设置的密码以及钥匙备份文件UTC--...能够得到自己账户的私钥,私钥通过一系列运算后能够得到公钥
比如比特币系统使用了椭圆曲线签名算法,通过私钥可以计算出公钥:
Hash(Hash(ECC(私钥))) -> 公钥
要想反向从公钥得到私钥是十分困难的
在以太坊中取公钥的最后20个字节作为地址
所以,一定要将钥匙备份文件备份保存,并且要牢记你自己的密码,如果你丢失了钥匙备份文件或者忘记了密码,那么你的币将丢失,密码是无法找回的。
geth中UTC文件与私钥的关系的更多相关文章
- Makefile中头文件在依赖关系中作用
摘于:http://bbs.csdn.net/topics/120024677 (1)在makefile的依赖关系中用不用体现.h头文件?(2)如果在依赖关系中要体现.h头文件,应该体现到什么层次?= ...
- Linux中的文件描述符与打开文件之间的关系
Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...
- Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列
http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...
- 每天进步一点点——Linux中的文件描写叙述符与打开文件之间的关系
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆能够看成是文件,文件又可分为:普通 ...
- unity中的文件存储路径与各平台(Android,iOS)的关系
原文链接:unity中的文件存储路径与各平台(Android,iOS)的关系 主要是这个问题困扰我了一阵子,所以特写写... unity中的的各种存储方法的对应关系(直接上截图吧) 重点说的是Appl ...
- (转)Linux中的文件描述符与打开文件之间的关系
转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...
- Linux中检索文件
1 , Use locate command It is a fast way to find the files location, but if a file just created ,it w ...
- linux中Makefile文件相关内容
第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...
- IIS 7 中设置文件上传大小的方法
在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...
随机推荐
- 后台MemoryStream图片流用ajax接收乱码问题
MemoryStream ms = new MemoryStream(); //要先把二进制流进行编码,再传输,解决乱码问题 Convert.ToBase64String(ms.ToArray()); ...
- SSM+solr 通过商品搜索学习solr的简单使用
学习了一下https://github.com/TyCoding/ssm-redis-solr这个github上的solr搜索功能,现在来记录一下. 我的理解就是solr有点类似于数据库,但它是有索引 ...
- lnmp首次安装重置mysql密码
第一种方法:一键修改LNMP环境下MYSQL数据库密码脚本 一键脚本肯定是非常方便.具体执行以下命令: wget http://soft.vpser.net/lnmp/ext/reset_mysql_ ...
- 使用Via浏览器+ADM下载器突破百度网盘下载限速
1.下载必要工具 via浏览器 ADM下载器 2.自定义 UA UA 是一串特殊字符,用来告诉所访问的网站,手机使用的操作系统及版本.CPU 类型.浏览器及版本等信息.UA 内容如下: Mozilla ...
- jQuery实例之ajax请求json数据案例
今天有这样一个需求,点击六个大洲,出现对应的一些请求信息,展示在下面,请求请求过后,第二次点击就无需请求.如图所示:点击北美洲下面出现请求的一些数据 html代码结构: <div class=& ...
- 使用jquery获取iframe内的元素属性
当需要获取iframe里的内容时需要有几个前提,否则你是获取不到的: 1:当前页面与iframe的src的页面需要在同一个域名下: 2:必须要等iframe里边的页面加载完成才能获取,否则你要获取的标 ...
- 如何在服务器上搭建svn
svn现在依然是一个流行的版本控制工具,但是大多数的人员只会使用客户端,并且也知道可以进行权限控制, 那么今天,我们就来给大家梳理一下 1.如何搭建svn的服务器 2.如何进行svn的权限控制 === ...
- django模板语言之Template
当前端的一些数据需要后端传送过来并展示时,用到了django的模板语言,模板语言的作用就是,在后端把一些处理好的数据,通过模板语言所规定的格式,通过render渲染,放到前端页面固定的位置展示.这之间 ...
- 修改sqlserver2008数据库的排序规则 (转)
修改sqlserver2008数据库的排序规则 (转) 修改SQL server 2008服务器排序规则 SQL Server 2008安装好后,发现服务器排序规则不对,又不想重装SQL S ...
- Python+Pandas 读取Oracle数据库
Python+Pandas 读取Oracle数据库 import pandas as pd from sqlalchemy import create_engine import cx_Oracle ...