【问题标题】:How to decrypt of the encrypted value in dart?如何解密飞镖中的加密值?
【发布时间】:2020-11-04 02:27:26
【问题描述】:

我正在测试 Dart 的加密哈希函数。我找不到任何有关解密的信息? 谁能告诉我如何解密加密值?

这是一个例子;

import 'dart:convert';
import 'package:crypto/crypto.dart'; 

void main() async { 
  var key = utf8.encode('p@ssw0rd'); 
  var bytes = utf8.encode("Dart and Aqueduct makes my life easier. Thank you."); 


  // TODO: ENCRYPTION 
  var hmacSha256 = new Hmac(sha256, key); // HMAC-SHA256 
  var digest = hmacSha256.convert(bytes); 
 
  print(“————ENCRYPTION—————“); 
  print("HMAC digest as bytes: ${digest.bytes}"); 
  print("HMAC digest as hex string: $digest"); 
  print('\r\n'); 


  // TODO: DECRYPTION 
     ???????????? 
  print(“————DECRYPTION—————“); 
  print(?????????); 

}

【问题讨论】:

    标签: encryption dart sha256 hmac


    【解决方案1】:

    IMO 最简单的方法是使用encrypt

    import 'package:encrypt/encrypt.dart';
    
    final key = Key.fromUtf8('put32charactershereeeeeeeeeeeee!'); //32 chars
    final iv = IV.fromUtf8('put16characters!'); //16 chars
    
    //encrypt
    String encryptMyData(String text) {
      final e = Encrypter(AES(key, mode: AESMode.cbc));
      final encrypted_data = e.encrypt(text, iv: iv);
      return encrypted_data.base64;
    }
    
    //dycrypt
    String decryptMyData(String text) {
      final e = Encrypter(AES(key, mode: AESMode.cbc));
      final decrypted_data = e.decrypt(Encrypted.fromBase64(text), iv: iv);
      return decrypted_data;
    }
    

    【讨论】:

      【解决方案2】:

      HMAC 是消息验证码。它是用于验证消息未被篡改的摘要,类似于签名。它是使用 单向 哈希函数构造的,在本例中为 SHA256。它不是加密,并且无法反转,因此您拥有的值无法被解密。

      您可以对 HMAC 做的唯一事情是,在给定 HMAC 和相应的纯文本的情况下,验证纯文本的来源并且它没有被篡改。

      GitHub page for the Dart crypto library,好像支持摘要算法。没有列出加密算法,因此如果要进行实际上可以解密的双向加密,则需要使用不同的库。 Cipher 库在这方面看起来很有希望。

      【讨论】:

      • 感谢 Sean,The Cipher 很旧,没有通过文档。那么,你知道除了 Chiper 之外还有什么比 dart 本身更特别的东西吗?
      • 抱歉,我自己并没有真正使用过 Dart,所以我对可用的库不熟悉,而且我似乎在 Google 上找不到任何其他选项。
      • 谢谢肖恩,我稍后会检查
      【解决方案3】:

      PointyCastle (https://pub.dartlang.org/packages/pointycastle) 过去曾被推荐过,但它似乎尚未针对 Dart 2 进行更新。:(

      【讨论】:

      • 好吧,感谢 Dart 社区。 Leo Cavalcante 做得很好。它是新的和改进的。目前,这非常适合在 Flutter Mobile App 和 Aqueduct web api 之间进行 2 路安全通信。 pub.dartlang.org/packages/encrypt
      【解决方案4】:

      实际上搜索了很多找不到比这更好的东西了。 encrypt 0.2.0 新版本并支持 Dart 2。 https://pub.dartlang.org/packages/encrypt#-installing-tab-

      我需要使 My Flutter 移动应用和 Aqueduct 可以共享安全通信的东西。里奥·卡瓦尔坎特是个好人。当我们昨天谈话时,他很快就回答了。所以这是对 Dart 的另一种喜爱。因为每个人都互相支持。

      它支持: AES(分组密码) Salsa20(流密码) RSA(非对称)(工作)

      将此包用作库

      1. 依靠它 将此添加到您的包的 pubspec.yaml 文件中:

      依赖: 加密:“^0.2.0”

      1. 安装它 您可以从命令行安装软件包: 与酒吧:

      $ 发布获取

      使用 Flutter:

      $ flutter packages get

      或者,您的编辑器可能支持 pub get 或 flutter packages get。查看您的编辑器的文档以了解更多信息。

      1. 导入 现在在您的 Dart 代码中,您可以使用: 导入'package:encrypt/encrypt.dart';

      【讨论】:

        【解决方案5】:

        如果有人正在寻找一个更简单的解决方案而不必依赖于库,我已经编写了我的自定义解决方案,用于在 dart 中加密和解密字符串值,它也可以在 Flutter 中使用。代码相当简单,所以我不打算谈论它是如何工作的代码。加密中使用的策略是x-或加密-解密。

           var encryptionKey ='your encryption key';
        
           static String encrypt(String data) {
            var charCount = data.length;
            var encrypted = [];
            var kp = 0;
            var kl = encryptionKey.length - 1;
        
            for (var i = 0; i < charCount; i++) {
              var other = data[i].codeUnits[0] ^ encryptionKey[kp].codeUnits[0];
              encrypted.insert(i, other);
              kp = (kp < kl) ? (++kp) : (0);
            }
            return dataToString(encrypted);
          }
        
          static String decrypt(data) {
            return encrypt(data);
          }
        
          static String dataToString(data) {
            var s = "";
            for (var i = 0; i < data.length; i++) {
              s += String.fromCharCode(data[i]);
            }
            return s;
          }
        

        【讨论】:

        • 如果您的应用程序要用于需要真正安全的任何事物,请不要使用您自己的加密算法,尤其是不要使用像这样有缺陷的加密算法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        • 2021-12-11
        • 2019-01-21
        • 2022-01-20
        • 2012-02-03
        • 1970-01-01
        相关资源
        最近更新 更多