当前位置: 首页 > 知识库问答 >
问题:

如何测试添加盐进行散列的有效性?

燕靖
2023-03-14

我对哈希比较陌生,我使用SHA-256和一种自制的生成盐的方法生成了值的哈希。它涉及为随机盐生成器的每个输入确定地找到种子。现在我想验证散列值的完整性,并检查添加的盐的有效性。然而,我不知道该怎么做。有人能帮忙吗?

共有3个答案

司徒骞尧
2023-03-14

马丁说,你最好使用操作系统提供的伪随机值作为盐,来自一个记录为适合密码使用的函数。

另外,如果你想评估你自己的salt程序,质量标准是,它应该产生大量可能的输出——你可以从随机数中获得分组、分散和重复的水平,即使salt计算的输入只有一两个不同。对于散列函数来说,这几乎是相同的标准,但您可能不需要某种安全的东西来防止从salt值派生原始输入。

另外,如果你正在从用户的地址重新生成salt,而他们更改了它,你会希望他们的当前密码使用新salt重新计算哈希值,或者将旧salt或地址保存到某个地方以供继续使用。。。否则,他们的下一次登录尝试将注定失败。

伊铭
2023-03-14

验证代码的正确性是单元测试的时间。

...一种软件测试方法,通过该方法对源代码的各个单元、一组或多组计算机程序模块以及相关的控制数据、使用程序和操作程序进行测试,以确定它们是否适合使用。1直观地说,人们可以将一个单元视为应用程序中最小的可测试部分。

单元测试借助于测试框架,测试框架可以检查代码库,找到任何标记为测试的内容,并按需(即当您要求时)和/或作为构建或部署过程的一部分自动运行它。目标是在一定程度上保证对测试代码所做的更改不会破坏应用程序。测试应涵盖输入及其预期输出的组合,从而强制执行行为。

流行的测试框架包括用于Java的JUnit、用于. Net语言的NUnit和许多其他框架。

无论如何,为了测试你的散列方案的完整性,你希望有一个封装所有行为的单一方法。你的单元测试将涵盖这一个方法1。用Java的JUnit语法编写这个(使用匹配器,你可以在这里看到更多关于它的信息),我们可能有这样的东西:

import org.junit.*;
public class PasswordSha256HasherTest {

    // Known inputs and outputs
    // hashes are precomputed with an external SHA256 calculator and verified
    public static final String password = "thisismypassword";
    public static final String unsaltedHash = "1da9133ab9dbd11d2937ec8d312e1e2569857059e73cc72df92e670928983ab5";
    public static final String salt = "a19044b439748e23ccbc82c5e2549ece5ceae026340ac6cb1f616549e64020e3";

    // This is what we want: SHA256(salt+password);
    public static final String saltedHash = "6c89a97409d598650e458a2040e900abbeca8e697137353fdaae97e382378433"

    // If your hasher has to be instantiated, do it like this
    private PasswordHasher hasher;

    @BeforeClass
    public static void beforeClass() throws Exception {
        hasher = new PasswordHasher();
    }

    @Test
    public void testCorrectPasswordHash() throws Exception {
        String hash = hasher.getPasswordHash(password, salt);
        // If PasswordHasher is a static class, you can skip the instantiation and do this
        String hash = PasswordHasher.getPasswordHash(password, salt);

        assertThat("Hash should match SHA256(salt + password)",
            hash, equalTo(saltedHash));
        // You could also test that the hash doesn't match the password or the salt
    }

    @Test(expected= IllegalArgumentException)
    public void testSaltIsRequired() throws Exception {
        // If the exception for an empty salt IS NOT thrown, this test fails.
        String hash = hasher.getPasswordHash(password, "");
    }

}

这只是一个开始,但这将实现问题的目标——验证哈希工具的完整性。你当然可以编写许多其他测试(验证密码复杂性要求、不允许使用字典中的单词、salt长度要求等)。一些测试倡导者认为,编写有用且有意义的测试需要与设计代码本身一样多的思考和投入。甚至还有测试驱动开发的理念,即首先编写测试(描述并封装代码的所有需求),并在所有测试通过后立即停止编写代码。这两者都有各自的优点。

如果您有兴趣向(可能)地球上一些最好的测试人员学习,我还鼓励您查看Google测试博客。

最后,在一个相关的说明中,我想把我的观点带回家,即盐应该是不确定的和全局唯一的。实现这一点的最简单方法是一个足够大的伪随机值,它完全独立于与您的系统和用户有关的一切,例如GUID。这个问题解决了确切的主题,就像这个关于安全性的问题一样。SE。正如互联网上常见的格言所说,如果你在用密码学做自己的事情,你几乎肯定是错的。

1:关于单元测试的正确范围存在一些争论。有人可能会说,对于登录系统来说,最有意义的工作单元是用户的创建和授权——具体来说,保护密码的机制只是授权模式其余部分的一部分,因此应该一起测试。我对他们说,单独测试每个部分可以使发现和纠正特定错误的过程更容易、更直接。

黄弘盛
2023-03-14

每个操作系统都有一个随机源,并提供从该源获取随机字节的方法。大多数应用程序无法自行生成加密安全的盐,这就是它们从随机源读取的原因。测试此方法在其他地方完成,无需在您的应用程序中测试这样的盐生成器,只需调用操作系统的方法。

 类似资料:
  • 我试图学习密码学,用散列和盐析在数据库中保存密码,所以我决定做一个登录系统来实现这个系统。 我的数据库包括 UserID int PK 用户名varchar(250) Salt varbinary(64) 密码varbinary(64) RegDate日期时间 电子邮件varchar(250) 我正在使用PBKDF2,但似乎这不是散列/盐析方法,如果不是呢? 如果是这样,我做得对吗? 我的钥匙 将

  • 虽然我理解加盐和散列密码过程背后的神学,但我不太理解方法论。据我所知,这个问题及其相关答案中列出的方法,以及MSDN的这篇文章,都经历了创建不同长度的salt的步骤,以便在散列给定密码的过程中使用。 但是,稍后检查密码怎么样?据我所知,再次创建哈希将导致生成全新的盐,最终导致在尝试登录时验证失败。 我是否错过了盐或盐配方的保存位置?还是我不太了解这个过程?

  • 问题内容: 我正在开发一个小型的Web应用程序,该应用程序在内部对用户进行身份验证。一旦用户通过身份验证,我的Web应用程序便会将一些信息(例如userID和Person的名称)传递给第三方Web应用程序。第三方开发人员建议我们对值进行哈希处理和加盐处理。 原谅我的无知,但这到底意味着什么? 我正在用Java编写应用程序。因此,我打算做的是使用Apache Commons Digest Utils

  • 问题内容: 如何检查变量是否包含有效的UUID / GUID标识符? 我目前仅对验证类型1和4感兴趣,但这不应该限制您的答案。 问题答案: 当前,UUID是在RFC4122中指定的。一个经常被忽略的边缘情况是NIL UUID,以下正则表达式考虑到了这一点,并将返回NILUUID的匹配项。请参阅以下有关仅接受非NILUUID的UUID。这两种解决方案均适用于版本1至5(请参见第三个模块的第一个字符)

  • 背景 jwt使用HS256加密方式 之前是采用uid+username+网站上线运行那一刻的毫秒数,但是因为在业务实现上有一定限制(无法保证每个业务(controller层)都获取的到user对象),故该方案已弃用 目前后端加盐为系统上线运行那一刻的毫秒数 但是感觉安全性比较低 问题 想问一下,在实际的开发场景下,大都如何设计加盐密钥?