Flutter / Dart:避免以纯文本形式存储密码

Zeu*_*sox 10 dart flutter

我在 Flutter 中使用 Dart 邮件程序,有一条评论说:

您如何使用和存储密码取决于您。当心以普通方式存储密码。

有什么办法可以散列密码吗?如何避免以纯文本形式存储它?

Sur*_*gch 7

在任何地方以纯文本形式存储密码通常不是一个好主意。但是,您处理密码的方式取决于平台。

所述flutter_secure_storage包使用iOS和密钥库Android电子钥匙串来存储密码(或标记)。

// Create storage
final storage = FlutterSecureStorage();

// Read secret 
String value = await storage.read(key: key);

// Write secret 
await storage.write(key: key, value: value);
Run Code Online (Sandbox Code Playgroud)

请注意,对于 Android,最小 API 为 18。

飞镖服务器

如果您正在制作服务器,更重要的是不要以纯文本形式存储用户密码。如果服务器遭到入侵,攻击者将可以访问所有密码,并且许多用户在多个帐户上使用相同的密码。

最好使用 OAuth2 将身份验证交给 Google 或 Facebook 或其他受信任的第三方。但是,如果您进行自己的授权,则应该使用盐对密码进行散列并保存散列值,而不是密码本身。这使得攻击者更难在服务器受到威胁的情况下获取用户密码。

一个基本的实现可以使用Dart 团队的加密包。

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

var password = 'password123';
var salt = 'UVocjgjgXg8P7zIsC93kKlRU8sPbTBhsAMFLnLUPDRYFIWAk';
var saltedPassword = salt + password;
var bytes = utf8.encode(saltedPassword);
var hash = sha256.convert(bytes);
Run Code Online (Sandbox Code Playgroud)

保存盐和哈希。丢弃密码。为每个用户使用不同的盐。

为了使暴力破解更加困难,您还可以查看dbcrypt包。

  • 您应该完全跳过这里的“基本实现”部分。自 70 年代以来,单轮(SHA-256 或其他)就被认为是对用户密码的不当处理。 (2认同)

Nic*_*one 1

如果你想散列

使用password_hash包。他们的示例代码非常容易使用:

var generator = new PBKDF2();
var salt = Salt.generateAsBase64String();
var hash = generator.generateKey("mytopsecretpassword", salt, 1000, 32);
Run Code Online (Sandbox Code Playgroud)

存储 和hash,您可以通过使用其他人的密码和保存的盐salt运行该函数来验证其他人的密码尝试。generator.generateKey

你真正想要什么

如果您尝试自动登录,您当然需要原始密码,而不是哈希值。你有几个选择

  1. 如果将安装您的应用程序的设备是安全的,例如它是公司拥有的设备,必须由员工登录,则以纯文本形式保存。没关系。正如任何公司的安全策略所应该的那样,您必须确保在处理电子产品之前擦除硬盘驱动器(并确保没有人可以走进来拿走 iPad 或其他任何东西)。

  2. 如果组织外部的未知人员将安装您的应用程序,您必须让他们登录并使用他们的电子邮件,或者打开一个 API 来代表他们发送电子邮件(以防止您的电子邮件发送垃圾邮件)。该应用程序会向该 API 发送 POST 来发送电子邮件。如果您在应用程序中拥有明文密码,他们就可以在自己的设备上找到它并滥用它。