哈希与加密(一)

声明:本文源自对哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用的学习整理

1、哈希与加密的区别

(1)哈希:将目标文本转换成具有相同长度、不可逆的杂凑字符串(或称消息摘要);

(2)加密:将目标文本转换成具有不同长度、可逆的密文。

实际上,使用相同的hash算法,不论目标文本有多长,得到的结果长度固定;加密算法往往与目标文本的长度成正比。

2、哈希与加密的数学基础

(1)哈希算法:R=H(S)是多对一映射,多个不同的S可以通过哈希算法H得到相同的R。所以就不存在一个逆映射,使得一个R能得到唯一的S.

一个设计良好的hash算法很难从哈希结果中找到目标文本的碰撞,另外,好的哈希算法对于目标文本的改变极其敏感。

何为碰撞?对于hash算法H,如果S1不等于S2,但是H(S1)等于H(S2),则称S1与S2互为碰撞。

(2)加密算法:R=E(S,Ke)是一对一映射,一个S结合加密密钥Ke,仅能得到唯一的密文R。反之,一个R结合解密密钥Kd也仅能得到唯一的S。

一个设计良好的加密算法应该是一个“单向陷门函数”,单向陷门函数的特点:即使知道函数本身也很难由函数的值求得其对应的自变量。可是一旦知道了陷门,自变量就很容易计算出来。

简单的说,好的加密算法应该是很难从密文求得明文的,但是如果一旦密钥被知道了,就很容易由密文求得明文。

在加密算法防攻击这块,往往假设攻击者知道加密算法和密文,所以我们应该对明文和密钥进行保护。

3、哈希与加密在软件中的应用

(1)哈希和加密在软件开发中最常见的应用是数据保护。

为了实现数据保护,选择哈希or加密的基本原则:

如果被保护的数据仅用做比较验证,以后不需要还原成明文,使用哈希;

如果被保护的数据需要还原成明文,使用加密;

如果你忘记密码,网站让你输入新的密码,则用的应该是哈希;

如果你忘记密码,网站发给你原密码,则用的应该是加密;

(2)使用简单的一次哈希进行数据保护:

如上图,对注册进来的口令进行哈希算法的映射,将得到的杂凑字符串存入数据库;对每次登录的口令进行哈希算法的映射,将得到的杂凑字符串和数据库里的注册口令杂凑字符串比较,有相同的,则登录成功。

最常用的哈希算法是MD5和SHA1。

时间: 2024-10-12 11:29:43

哈希与加密(一)的相关文章

哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

0.摘要 今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义.文中作者从实践经验出发,讨论了信息管理软件中如何通过哈希和加密进行数据保护.但是从文章评论中也可以看出很多朋友对这个方面一些基本概念比较模糊,这样就容易“照葫芦画瓢”,不能根据自身具体情况灵活选择和使用各种哈希和加密方式.本文不对哈希和加密做过于深入的讨论,而是对哈希和加密的基本概念和原理进行阐述.比较,并结合具体实践说明如何选择哈希和加密算法.如何提高安全性等问题,使朋友们做到“知其然,知其所以然”,这样就

【转】哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

0.摘要 今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义.文中作者从实践经验出发,讨论了信息管理软件中如何通过哈希和加密进行数据保护.但是从文章评论中也可以看出很多朋友对这个方面一些基本概念比较模糊,这样就容易“照葫芦画瓢”,不能根据自身具体情况灵活选择和使用各种哈希和加密方式.本文不对哈希和加密做过于深入的讨论,而是对哈希和加密的基本概念和原理进行阐述.比较,并结合具体实践说明如何选择哈希和加密算法.如何提高安全性等问题,使朋友们做到“知其然,知其所以然”,这样就

C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)

openssl里面有很多用于摘要哈希.加密解密的算法,方便集成于工程项目,被广泛应用于网络报文中的安全传输和认证.下面以md5,sha256,des,rsa几个典型的api简单使用作为例子. 算法介绍 md5:https://en.wikipedia.org/wiki/MD5 sha256:https://en.wikipedia.org/wiki/SHA-2 des: https://en.wikipedia.org/wiki/Data_Encryption_Standard rsa: htt

C# salt+hash 加密

一.先明确几个基本概念 1.伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的.伪随机数并不是假随机 数,这里的"伪"是有规律的意思,就  是计算机产生的伪随机数既是随机的又是有规律的.怎样理解呢?产生的伪随机数有时遵守一定的规律,有 时不遵守任何规律:伪随机数有一部分遵守一定的规律:另一部分不遵守任何规律.比如"世上没有两片形状完全相同的树叶",这正是点到了事 物的特性,即随机性,但是每种

数据的加密和解密

当前网络环境中,数据的来往是十分密切,面对着海量的信息集合,很少有人去考虑如何去保证,或者说数据是怎么被保证安全的到达目的地的,在默认情况下,数据的发送是明文发送的,也就是说,数据的发送可以被除发送方和接收方的第三方所截获,读取信息,或者通过长年累月的数据量分析得出发送方的某些重要信息,这对于用户来说都是不可接受的,所以随着网络数据的不断发展,人们不断对数据加密进行更新换代,由一开始的传统加密,通过替换的方式加密信息,到后来的块加密算法: 现在的加密算法,如对称加密,公钥加密,作为一段时期的主要

建立简单的哈希表

#include<stdio.h> #include <stdlib.h> unsigned int SDBMHash(char *str) { unsigned int hash = 0; while (*str) { // equivalent to: hash = 65599*hash + (*str++); hash = (*str++) + (hash << 6) + (hash << 16) - hash; } return (hash &

如何安全的存储用户密码?(下)代码实现pbkdf2算法加密

这辈子没办法做太多事情,所以每一件都要做到精彩绝伦! People can't do too many things in my life,so everything will be wonderful   乔布斯 本文参考博客: http://wyait.blog.51cto.com/12674066/1918470和 http://wyait.blog.51cto.com/12674066/1918474 参考资料:java API6.0中文版.chm 本文以java为例,进行实际加解密操作

转载 C#使用Salt + Hash来为密码加密

转载 http://www.csharpwin.com/csharpspace/13412r9615.shtml (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码. 解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function).哈希函数的具体定义,大家可以在网上或者相关书籍中查阅到,简单地说,它的

[转]C#使用 Salt + Hash 来为密码加密

本文转自:http://www.csharpwin.com/csharpspace/13412r9615.shtml (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码. 解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function).哈希函数的具体定义,大家可以在网上或者相关书籍中查阅到,简单地说,