基于生物特征密钥生成研究 ------应用于区块链领域密钥的生成办法

摘要:我带领团队开发过以太坊钱包,开发过EOS钱包EOSPocket,Cosmos钱包设计,钱包最重要的一点是什么,管理私钥。所以,我们的DApp都有一个功能就是,备份私钥,但是私钥又长又难记。一直困扰用户使用。我们的DApp应用,还需要帮助用户在本地加密后保存私钥,如果钱包遭到攻击,用户私钥很有可能丢失,基于用户特定的生物特征信息生成的私钥不仅随时携带不丢失,而且破解困难,他是目前信息安全领域的一个研究热点,从指纹,眼虹膜,视网膜、人脸识别,手指血管切片等领域,概述生物特征生成密钥的框架。并介绍密钥生成系统的安全性。并利用区块链生成公私钥的办法,生成公私钥,应用到本系统中。DApp中不再保存用户私钥,只有在需要发送交易瞬间,采集生物特征,生成私钥,签名,发送交易即可。交易发送完毕,丢掉私钥。我们的DApp不再帮助客户保存私钥,客户私钥永久的保存在客户的人体特征中。这样客户可以放心使用我们的DApp。不要担心私钥丢失或者被盗的情况。

  1. 如何生成基于生物特征的密钥。
    很多研究人员研究基于生物特征的认证,该认证与基于生物特征的密钥生成存在根本差异,前者认证基于生物特征的密钥生成存在根本差异,前者基于具有用户模板的分类器来区别已认证的用户和冒名顶替者,我们研究的是将生物特征转换为一个唯一的密钥,该密钥不能够从冒名顶替者的生物特征生成。我们提出一种基于生物特征生成密钥的框架。
    如下图:
    在这里插入图片描述
    1.1 首先收集可信用用户和其他用户的生物特征作为训练数据,进行一个用户依赖的特征变换,使得可信用用户变换后的特征在特征空间是紧凑的,而其他用户(顶替用户)的特征是分散的,那么可信用户变换后的特征与顶替用户特征是可区分的。这样我们就可以利用一个稳定的密钥生成机制生成稳定的密钥,根据可区分度,每个变换后的特征可以贡献一位或者多位数据,作为密钥生成的种子。不仅生成了密钥,而且扩大了密钥空间以抵抗穷举搜索攻击。

    1.2 其次可区分特征生成的目标是找到一个变化使得每个以变换的特征是可区分的。可以将可信用户与顶替用户区分。根据理论,可信用户与顶替用户之间已变换特征的分离或多样性均能提供两者之间的区分度。所以给定生物特征的集合作为训练数据,有不同的标准以找到最佳变化。Fisher线性判别分析(Linear Discriminant Analysi,LDA)广泛应用于特征提取和维度降低。Fisher线性判别式的目标是寻找一个最优的方向使得投影样本的类间散度和类内散度矩阵之比达到最大值,也就是最佳的可区分度。

    1.3最后稳定密钥根据生物特征的可区分性生成稳定的密钥。对于一个特征,如果可行均值与全局均值之间的距离大于可信标准方差K倍,则认为该特征是可区分的。否则基于Shamir的密钥共享方案将抛弃该特征。

  2. 基于指纹的密钥生成办法
    2.1、相对于人的其他生物特征来说,指纹特征数据提取技术研究要成熟的多。并且取得了丰富的学术成功,与其他生物统计学特征相比,指纹特征更容易提取,预处理,更可信,且特征尺寸也很小,有利于数据的保存于处理。

    人的指纹特征有总体特征和局部特征两种。在密钥生成研究中我们采用指纹的局部特征,局部特征是指指纹拓扑图中的集中有效的特征,他是指纹密钥的最基本依据。即便是两种指纹的总体特征相同,但是他们的局部特征缺不可能完全相同,美国国家标准测量局NISTC(National Instituteof Stardardsand Testing)提出了一种指纹细节分类方式,将指纹特征分为四类:端点,分叉点,复合点和未定义特征,而最为重要的细节特征就是端点和分叉点。

    2.2、端点(Ending)分叉点(fBifurcatb)指纹特征最常用的是细节特征提取,因此基于细节特征点的位置,类型和方向进行匹配是目前最为广泛的匹配方法。我们今天研究一下指纹图像的特征提取算法所提取的细节特征是端点和分叉点,我们将指纹特征作为一个特征信息集合,可将其转换为欧氏空间上的指纹特征向量X=,…,X),其中蕾表示第S个特征,算法非常复杂,我们这里不再赘述。

  3. 我们研究一下如何利用获取的生物特征,生成区块链领域使用的公私钥。
    我们分析EOS源代码中实现公私钥加密部分,可以参看源代码eos/libraries/fc/src/crypto下,private_key.cpp文件
    这个文件清晰描述了私钥的生成办法。
    获取公钥的方法:

public_key private_key::get_public_key() const
   {
      return public_key(_storage.visit(public_key_visitor()));
   }

对private_key进行sign的方法。

  signature private_key::sign( const sha256& digest, bool require_canonical ) const
   {
      return signature(_storage.visit(sign_visitor(digest, require_canonical)));
   }

这个文件的方法非常多,都是帮助客户生成公私钥的。
关键的方法private_key::private_key(…)可以帮助我们生成客户私钥
我们可以通过采集生物特征,利用稳定的生物特征生成base58str,
来生成客户私钥。

   private_key::private_key(const std::string& base58str)
   :_storage(parse_base58(base58str))
   {}

本文不在详细介绍具体生成办法。

2018年12月14日深夜,写于深圳。

猜你喜欢

转载自blog.csdn.net/jambeau/article/details/84997052