Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 有可能解密SHA1吗_Security_Spring Security_Sha1_Sha - Fatal编程技术网

Security 有可能解密SHA1吗

Security 有可能解密SHA1吗,security,spring-security,sha1,sha,Security,Spring Security,Sha1,Sha,是否可以使用SHA1算法解密(保留实际字符串)保存在db中的密码 示例:如果密码是“password”,并且它存储在数据库中为“sha1$4fb4c$2BC693F8A86E2D87F7C382A32E3D50FC945B24”,则有机会保留“sha1$4fb4c$2BC693F8A86E2D87F7C382A32E3D50FC945B24”中相同的“password”(字符串),sha1是单向散列。因此,您无法真正还原它 这就是为什么应用程序使用它来存储密码的散列,而不是密码本身 与每个散列函

是否可以使用
SHA1
算法解密(保留实际字符串)保存在db中的密码


示例:如果密码是
“password”
,并且它存储在数据库中为
“sha1$4fb4c$2BC693F8A86E2D87F7C382A32E3D50FC945B24”
,则有机会保留
“sha1$4fb4c$2BC693F8A86E2D87F7C382A32E3D50FC945B24”中相同的
“password”(字符串)
,sha1是单向散列。因此,您无法真正还原它

这就是为什么应用程序使用它来存储密码的散列,而不是密码本身

与每个散列函数一样,SHA-1将一个较大的输入集(键)映射到一个较小的目标集(散列值)。因此,可能发生碰撞。这意味着输入集的两个值映射到相同的哈希值

显然,当目标集变小时,碰撞概率增加。但反之亦然,这也意味着当目标集变大且SHA-1的目标集为160位时,碰撞概率降低

杰夫·普雷辛(Jeff Preshing)写了一篇很好的博客,可以帮助您决定使用哪种哈希算法。谢谢你,杰夫

在他的博客中,他展示了一个表格,告诉我们给定输入集的冲突概率

如您所见,如果您有77163个输入值,则32位哈希的概率为1/2

一个简单的java程序将向我们展示他的表格所显示的内容:

public class Main {

    public static void main(String[] args) {
        char[] inputValue = new char[10];

        Map<Integer, String> hashValues = new HashMap<Integer, String>();

        int collisionCount = 0;

        for (int i = 0; i < 77163; i++) {
            String asString = nextValue(inputValue);
            int hashCode = asString.hashCode();
            String collisionString = hashValues.put(hashCode, asString);
            if (collisionString != null) {
                collisionCount++;
                System.out.println("Collision: " + asString + " <-> " + collisionString);
            }
        }

        System.out.println("Collision count: " + collisionCount);
    }

    private static String nextValue(char[] inputValue) {
        nextValue(inputValue, 0);

        int endIndex = 0;
        for (int i = 0; i < inputValue.length; i++) {
            if (inputValue[i] == 0) {
                endIndex = i;
                break;
            }
        }

        return new String(inputValue, 0, endIndex);
    }

    private static void nextValue(char[] inputValue, int index) {
        boolean increaseNextIndex = inputValue[index] == 'z';

        if (inputValue[index] == 0 || increaseNextIndex) {
            inputValue[index] = 'A';
        } else {
            inputValue[index] += 1;
        }

        if (increaseNextIndex) {
            nextValue(inputValue, index + 1);
        }

    }

}
我的输出是

86390
86390
结论:

如果您有一个SHA-1值,并且您希望恢复输入值,则可以尝试暴力攻击。这意味着您必须生成所有可能的输入值,对它们进行散列,并将它们与您拥有的SHA-1进行比较。但这将消耗大量的时间和计算能力。有些人为一些输入集创建了所谓的彩虹表。但这些只存在于一些小的输入集


请记住,许多输入值映射到单个目标哈希值。因此,即使您知道所有映射(这是不可能的,因为输入集是无界的),您仍然无法说出它是哪个输入值。

SHA1
是一个加密哈希函数,因此设计的目的是避免您尝试执行的操作

但是,从技术上讲,破坏
SHA1
散列是可能的。您可以通过猜测散列的内容来实现。这种暴力手段当然不是有效的,但这几乎是唯一的办法

所以要回答你的问题:是的,这是可能的,但你需要强大的计算能力。一些研究人员估计


就我们今天所知,除了猜测散列输入之外,没有其他方法。这是因为
mod
等操作会从输入中删除信息。假设您计算
mod 5
,得到
0
。输入是什么?是
0
5
还是
500
?你看,在这种情况下,你不可能真正“回到”过去。

由于SHA-1将多个字节序列映射到一个字节序列,你不能“解密”散列,但理论上你可以找到冲突:具有相同散列的字符串


现在看来,破解一个散列需要花费大约相当于计算机时间的时间,所以你的努力可能最好花在其他地方。

你说得很对。但也有很多网站为sha1提供解密功能。这一点很好。因此,如果要进行反向哈希查找,并非所有内容都会丢失:),但这是一个不同的原则。该服务获取一些文件,计算散列并将其存储在数据库中。因此,您可以进行反向查找。但是,这些服务不会解密SHA-1哈希。因此,如果您输入了该数据库不知道的哈希值,则不会得到结果。在我看来,这个问题的目的是要求一个算法来有效地解密任意散列。这是不可能的(据我们所知)。通过使其成为一个开放的存储库(而不是一个人的努力),您可以从中获得更大的解密密码池。出于这个原因,通常最好在加密例程中添加一个复杂的种子;因此,确保明显的用户密码和复杂的密码一样难以破解。现在的密码大约为7.5万到12万美元,因此根据所涉及数据的重要性,价格可以承受得起。:-)数据已经是复数形式,@Slake,所以数据毫无意义。事实上,单数词是datum(来自拉丁语),尽管数据也变得可以接受单数。
System.out.println("VvV".hashCode());
System.out.println("WWV".hashCode());
86390
86390