首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >沙-3可变长度散列,与使用BouncyCastle截断Java中的法线散列相同

沙-3可变长度散列,与使用BouncyCastle截断Java中的法线散列相同
EN

Stack Overflow用户
提问于 2021-05-31 19:56:30
回答 1查看 418关注 0票数 1

我需要根据Java中的一些输入数据(比如客户电子邮件地址)生成30个字符的固定长度散列。经过一些搜索,我发现了SHA-3海绵函数,在那里我可以指定所需的长度。我使用Bouncy城堡SHAKEDigest类实现了下面的内容。

代码语言:javascript
复制
public class App {
    public static void main(String[] args) {
        final String message = "Hello World!";
        System.out.println(getHash(message, 64));
        System.out.println(getHash(message, 30));
        System.out.println(getHash(message, 20));
    }

    static String getHash(final String message, final int lengthInCharacters) {
        final byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);

        final SHAKEDigest digest = new SHAKEDigest(128);

        final byte[] hashBytes = new byte[lengthInCharacters / 2];
        digest.update(messageBytes, 0, messageBytes.length);
        digest.doOutput(hashBytes, 0, hashBytes.length);

        return Hex.toHexString(hashBytes);
    }
}

如果我执行它,我将得到以下输出:

代码语言:javascript
复制
aacfe6ebd3737d9f195c837c5281d3f87646ecd7e43864e1a40456e40f264046
aacfe6ebd3737d9f195c837c5281d3
aacfe6ebd3737d9f195c

根据请求的长度,我期望散列是完全不同的。现在看来,我还可以使用JDK MessageDigest生成一个简单的SHA-256散列,并按照所需的长度截断它。

我是做错了什么,还是误解了海绵功能的意义?

包含单元测试的完整代码可在以下站点获得:https://github.com/steinsag/java-dynamic-hash

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-01 18:12:18

SHAKEn实际上是构建在Keccak海绵上的可扩展输出函数(XOFs),其方式与(固定长度) SHA3散列相同;参见https://en.wikipedia.org/wiki/SHA-3#Instances

但是,你似乎误解的一点是,底层的海绵使每一个/所有这些确定性--给定的实例(参数化)--每次为相同的输入产生相同的输出,并且不受输出大小的影响。因此,SHA3-256(m)不是SHA3-512(m)的前256位,因为它有不同的参数,而SHAKE128(m, 256 )是SHAKE128(m,512)的前256位,而不是SHAKE256(m,256)。

是的,您可以将任何SHA3哈希(或者SHA2哈希)截断到一个比其正常大小更小的大小,并得到一个更小但同样好的加密散列(对于实际数据来说是伪随机的、不可逆的和非碰撞的),而且人们实际上已经这样做了几十年。但是你不能安全的增加它,你可以用一个XOF像摇一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67779594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档