flutter - 如何将 sha256 的摘要添加到 flutter 中的字符串?

标签 flutter cryptography

我正在将密码传递给 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 方法,但使用它给我一个错误。

最佳答案

当你打印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 的一部分的情况下(因为它几乎可以保证生成的字符串不是网络安全的)。

关于flutter - 如何将 sha256 的摘要添加到 flutter 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59725688/

相关文章:

flutter - 为同一情况切换具有多个值的情况

c++ - 重复的 Windows 加密服务提供程序导致 Python w/Pycrypto

c - 波浪号(〜)运算符的作用是什么?

flutter - 如何链接多个动画对象?

flutter - 比较 Dart 中的对象值数组?

C++ limits.h 定义

php - 随机 sleep 可以防止定时攻击吗?

javascript - 解密AES十六进制消息完成与服务器的相互认证

node.js - 如何从 Flutter 发出纯文本 http(而非 https)请求

flutter - 如何在 flutter 中更改抽屉图标?