【问题标题】:How to add digest from sha256 to string in flutter?如何将sha256的摘要添加到颤动的字符串中?
【发布时间】:2021-02-27 03:19:59
【问题描述】:

我正在将密码传递给 sha256。我成功创建了 sha256 并且还可以打印它。当我尝试将 digest.bytes 转换为字符串并附加它时,问题就开始了。

import 'package:crypto/crypto.dart';

var url = "http://example_api.php?";
url += '&hash=';

// hash the password
var bytes = utf8.encode(password);
var digest = sha256.convert(bytes);
print("Digest as hex string: $digest");

url += String.fromCharCodes(digest.bytes);

这是打印的:摘要为十六进制字符串:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4

这是附加到 url:¬gBóá\vá¥âUðg6#ȳ´Eùx×ÈFô

我做错了什么?我也尝试了 utf8.decode 方法,但使用它会出错。

【问题讨论】:

    标签: flutter cryptography


    【解决方案1】:

    当您打印digest 时,print 方法将调用digest.toString(),该方法被实现为使用十六进制表示返回一个摘要字节字符串。如果你想要同样的东西,你有几个选择:

    • 显式(或隐式)调用digest.toString()
    final digestHex = digest.toString(); // explicitly
    final digestHex = '$digest';         // implicitly
    
    • 将字节数组映射到其等效的十六进制数
    final digestHex = digest.bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
    
    • 使用convert 包(这是加密包的作用)
    import 'package:convert/convert.dart';
    
    ...
    
    final digestHex = hex.encode(digest.bytes);
    

    使用utf8.decode 时出现错误的原因是您的摘要不是编码的 UTF-8 字符串,而是所有意图和目的完全随机的字节列表。您正在尝试将字节直接转换为字符串,如果您可以假设它们已经代表有效字符串,那么这样做会更容易。但是,对于散列算法的字节输出,您不能安全地做出这样的假设。

    但是,如果出于某种原因您仍想使用此选项,请使用 utf8.decode 的第二个可选参数强制它尝试解码字节:

    final digestString = utf8.decode(bytes, allowMalformed: true);
    

    作为参考,[1, 255, 47, 143, 6, 80, 33, 202] 的字节列表会生成“�/�P!�”,其中“�”表示无效/控制字符。您不想使用此选项,尤其是在字符串将成为 URL 的一部分的情况下(因为实际上可以保证生成的字符串不会是网络安全的)。

    【讨论】:

      【解决方案2】:

      对于 Digest 对象的十六进制表示,请显式调用Digest.toString()(尽管在格式化字符串中,即"url${digest}",这是为您隐式完成的)。

      坦率地说,我不熟悉String.fromCharCode,但I think it's looking for UTF-16 and not UTF-8 bits。我写了一个终端示例来说明这一点,以及输出有何不同。

      import 'dart:core';
      import 'dart:convert';
      import 'package:crypto/crypto.dart';
      
      void main() {
      
        const String password = "mypassword";
      
        // hash the password
        var bytes = utf8.encode(password);
        var digest = sha256.convert(bytes);
      
        // different formats
        var bytesDigest = digest.bytes;
        var hexDigest = digest.toString();
      
        String url = "http://example_api.php?hash=";
      
        print(url + hexDigest);
        print(url + String.fromCharCodes(bytesDigest));
      
      }
      

      输出:

      > dart test.dart
      http://example_api.php?hash=89e01536ac207279409d4de1e5253e01f4a1769e696db0d6062ca9b8f56767c8
      http://example_api.php?hash=à6¬ ry@Ö,©¸õggÈ
      

      【讨论】:

      • 啊该死,我不知道这个网站是怎么运作的 =) TY fren
      猜你喜欢
      • 2012-02-15
      • 2012-04-17
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多