• 注册
  • 开发教程 开发教程 关注:23 内容:62

    MOAC哈希函数

  • 查看作者
  • 打赏作者
    • 开发教程
    • 大版主
      墨客战士

      本文中的哈希和hash是同一个词意,有可能会交叉出现。

       Hash函数在数字签名和消息完整性检测等方面有着广泛的应用。

      1.1 基本概念

      加密(encryption)算法:将明文转换成密文的过程。

      密文(ciphertext):加密算法的输出,看起来是完全随机而杂乱、隐藏了原文含义的数据,依赖于明文和密钥。

      Hash函数是密码学的一个重要分支,又称为哈希函数、散列函数;它是一种将任意长度的输入变换为固定长度的输出且不可逆的单向密码体制。

      用一个简单的等式来表示哈希函数:

      MOAC哈希函数

      碰撞:

      2.如果 x 和 y 是两个不同的消息,存在H(x)= H(y),则称 x 和 y 是hash函数H的一个碰撞。

      hash函数的特点:

       2、易计算:对于任意给定的消息x,计算其hash值都很容易;

      4、 高灵敏性:这是从比特位角度出发,指的是1比特位的输入变化会造成50%的比特位发生变化。

      弱抗碰撞性:对于给定的消息x,要发现另一个消息y,满足H(x)=H(y)在计算上是不可行的;


      消息摘要算法(MD5,Message-Digest Algorithm)



      在墨客区块链的地址生成过程中,最能体现哈希函数的特性。简述其步骤如下:

      随机数用于生成私钥,若随机数可以被预测或重现,则私钥就会立刻形同虚设。

      所以保证随机数拥有下列三项特征,至关重要:

      (2)不可预测性:不能从过去的数列推测下一个出现的数 ;

      选择生成私钥的随机数方法时,需要选择满足密码学强度的随机数方法,比如  crypto.randomBytes。当你调用 crypto.randomBytes(32) 方法时,它会等待熵池搜集足够的信息后,返回 64 位的随机数,即私钥。

      步骤3.公钥。


      当我们调用 createKeccakHash("keccak256") 方法时,Keccak 使用散列函数,对公钥与初始的内部状态做 XOR 运算得到 32 字节哈希值,取其后 20 字节,转成 40 位的 16 进制字符,即为地址。

      MOAC哈希函数

      过程如下:

      MOAC哈希函数

      用户怎么实现以上的过程,简单引用代码如下:

      const EthCrypto = require('eth-crypto');

      const identity = EthCrypto.createIdentity();

      //可以直接显示私钥、公钥和地址

      console.log('publicKey: '+identity.publicKey);

       

      const publicKey = EthCrypto.publicKeyByPrivateKey(identity.privateKey);

      console.log('publicKeyByPrivateKey: '+publicKey); 

      //从公钥得到地址

      console.log(); 



      创建文件hash.js;代码如下:

      console.log(crypto.getHashes()); //打印支持的hash算法

      运行结果如下:

      创建文件hashMD5.js;代码如下:

      var crypto = require('crypto');        //加载crypto库

      var md5 = crypto.createHash('md5');    //定义加密方式:md5,不可逆;

      var d = md5.digest('hex');             //加密后的值d


      MOAC哈希函数

      var crypto = require('crypto');

       

          var s1 = new Date();

          var filename = "package.json";

       

          txt.on('data', function(d) {

          });

          txt.on('end', function() {

              var s2 = new Date();

              console.log(algorithm+','+(s2-s1) +'ms,'+ d);

      }

      function doHash(hashs){

              hashAlgorithm(name);

      }

      var algs = ['md5','sha1','sha256','sha512','RSA-SHA1','RSA-SHA256','RSA-SHA512'];

      doHash(algs);

      运行结果如下:


      var crypto = require('crypto');  //加载crypto库

      var token1='miyue';              //加密的密钥;

      token1 = buf.toString('hex');    //密钥加密;

      var SecrectKey=token1;           //秘钥;

      Signture.update(content);

      console.log("加密的结果:"+miwen);


      MOAC哈希函数

      很明显,第9行代码中的sha1算法可以替换为3.1运行结果中的任意算法。

      4.2 Hmac算法的比较

      新建文件hashHmacAlgorithm.js:

      var crypto = require('crypto');

       

          var s1 = new Date();

          var filename = "package.json";

       

          txt.on('data', function(d) {

          });

          txt.on('end', function() {

              var s2 = new Date();

              console.log(algorithm+','+(s2-s1) +'ms,'+ d);

      }

      function doHmac(hashs,key){

          console.log("============================");

              hmacAlgorithm(name,key);

      }

      var algs = [ 'md5','sha1','sha256','sha512','RSA-SHA1','RSA-SHA256','RSA-SHA512'];

      // 短KEY的测试

          doHmac(algs,"abc");

       

      setTimeout(function(){

          doHmac(algs,key);


      MOAC哈希函数

      输出以逗号分隔,分别是算法名、时间、密文。

      通过比对短key和长key,在编码比较长的算法上面会有一些影响。由于Hmac有了第二参数key,所以会比单独的hash加密算法,有更好的安全保证。

      请登录之后再进行评论

      登录
    • 做任务
    • 实时动态
    • 偏好设置
    • 帖子间隔 侧栏位置: