编码,加解密,签名,Hash

工作中会听到各种各样是是而非的词汇,base64,url,sha256,rsa,hash等等,你能很好的分清这些词语吗?

这次我想把它们统一的整理说明下:

一: 编码

编码是信息从一种形式或格式转换为另一种形式的过程,所以他们是可逆的,不能称之为加密。

下面列举几个常见的(参考编码那些事):

html实体编码(10进制与16进制):

如把尖括号编码[ < ]  -----> html十进制: <  html十六进制:<

javascript的八进制跟十六进制:

如把尖括号编码[ < ]  -----> js八进制:\74  js十六进制:\x3c

jsunicode编码:

如把尖括号编码[ < ]  ----->jsunicode:\u003c

url编码 base64编码:

如把尖括号编码[ < ]  -----> url: %3C  base64: PA==

你可以根据他们编码后的特征来快速分辨一个看上去毫无意义的字符是由什么编码转换过来的,并试试将其转换回去,百度有一个转化工具:xss编码转换工具

如下:

编码类型 特征(以什么特征字符开头) 以“<”字符为例
html实体编码10进制 &# &#60
html实体编码16进制 &#x &#x3c
javascript的八进制 \ \74
javascript的十六进制 \x \x3c
jsunicode编码 \u \u003c
url编码 % %3C
base64编码 PA==

base64编码的内容可以参考这边博客base64相关

二:加解密

加密的目的就是让密文是不可逆的,除非你掌握了相关密钥。

加解密的算法分为2种:对称加密算法和非对称加密算法

对称加密算法:


算法


类型


分组长度


密钥长度


DES


分组


64


64(56)


3DES


分组


64


64(56)*3


AES


分组


128


128\192\256


SM1


分组


128


128


SM4


分组


128


128


RC4


   

根据加密的目的不同可以选用不同的算法,如果是用于分组的话,建议使用AES256,这个是安全的

非对称加密算法:


RSA


1024/2048


加密/签名


ECC


128/256


加密/签名


SM2


256


加密/签名

非对称加密算法有公钥和私钥。使用时建议使用RSA2048,这个安全的(RSA1024目前是安全的,不过随着技术的发展,就不好说了)

如果用私钥对信息进行加密,是做为加密来使用的,也就是说让密文不可破解

如果用公钥对信息进行加密,就是为了做签名来使用的,签名的目的是使得这个过程不可篡改,不可抵赖,不可伪造,下面简单介绍一下签名:

签名:百度上的以sha编码加密为例

(1) 被发送文件用SHA编码加密产生128bit的数字摘要(见上节)。

数字摘要

(2) 发送方用自己的私用密钥对摘要再加密,这就形成了数字签名。

(3) 将原文和加密的摘要同时传给对方。

(4) 对方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生又一摘要。

(5) 将解密后的摘要和收到的文件在接收方重新加密产生的摘要相互对比。如两者一致,则说明传送过程中信息没有被破坏或篡改过。否则不然。

三: hash

参考freebuf上的该文章:如何安全的存储用户的密码

什么是hash

hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364946366
hash("waltz") = c0e81794384491161f1777c232bc6bd9ec38f616560b120fda8e90f383853542

Hash 算法是一种单向的函数。它可以把任意数量的数据转换成固定长度的“指纹”,这个过程是不可逆的。而且只要输入发生改变,哪怕只有一个bit,输出的 hash值也会有很大不同。这种特性恰好合适用来用来保存密码。因为我们希望使用一种不可逆的算法来加密保存的密码,同时又需要在用户登陆的时候验证密码 是否正确。

还需要注意的是用来保护密码的hash函数跟数据结构课上见过的hash函数不完全一样。比如实现hash表的hash函数设计的目的是快速,但是不够安 全。只有加密hash函数(cryptographic hash functions)可以用来进行密码的hash。这样的函数有SHA256, SHA512, RipeMD, WHIRLPOOL等,推荐sha256。

我们平常最常听到的hash是指hash值,最常用的是md5的hash值,网上也有很多破解md5明文的网站。

如果你准备写认证系统,那么我参考freebuf上的文章做如下推荐:

存储一个密码:

1, 使用CSPRNG生成一个长的随机盐。 (盐的长度与hash值的长度相同,256位)

2, 将密码和盐拼接在一起,使用标准的加密hash函数比如SHA256进行hash

3, 将盐和hash记录在用户数据库中

验证一个密码:

1, 从数据库中取出用户的盐和hash

2, 将用户输入的密码和盐按相同方式拼接在一起,使用相同的hash函数进行hash

3, 比较计算出的hash跟存储的hash是否相同。如果相同则密码正确。反之则密码错误。

时间: 2024-10-06 14:56:50

编码,加解密,签名,Hash的相关文章

C#NET字符编码加解密的参考代码

//C#NET字符编码加解密的参考代码我是从老外程序里面拷贝出来的希望对大家有所用 1 public string Encrypt(string name) { 2 byte ivId = GetIVId(name); 3 cipher.IV = GetIV(ivId); 4 var buf = Encoding.UTF8.GetBytes(name); 5 6 using (var ms = new MemoryStream()) { 7 ms.WriteByte(ivId); 8 using

iOS RSA加解密签名和验证

转自:http://www.jianshu.com/p/81b0b54436b8 Pre:在公司负责了一个项目,需要用到iOS RSA验证签名的功能.后台给我的仅仅是一个公钥的字符串.经过起初的一段时间的挣扎,发现远远没有那么简单.iOS RSA是需要证书的,而java的后台只能给我一个公钥字符串.搜索了无数网页还是没找到能用的成型的代码.最后还是参考了下支付宝的SDK的签名机制,明白可以先把公钥字符串写入文件然后读取文件得到openssl 中的RSA结构体指针.现在精心整理了下iOS RSA使

加解密/签名验签

一.我加密.签名的过程 1,生成18位随机密钥:rand 067870-544583-448433: 2,使用对方的公钥证书(cer文件),并使用“RSA”算法,对随机密钥的字节数组加密,得到一个字节数组,将其转化为小写的十六进制字符串:secretKey 07ed7542951980385e32c149039255aabf8009e1e98a9432db19755e45e07361d318b98393d431cad4f656df7bc254548bacc92c53aa9566fd9ca1105

Python-RSA(公私钥制作,加解密,签名)

Signing data with the RSA algorithm Step1. Create private/public keypair (optional) openssl genrsa -out private.pem 1024  >private.pem This creates a key file called private.pem. This file actually have both the private and public keys, so you should

python实现RSA加密和签名以及分段加解密的方案

python实现RSA加解密和签名加解签 1.生成秘钥对 在这边为了方面演示,手动生成一个密钥对(项目中的秘钥对由开发来生成,会直接给到我们) 生成秘钥对的时候,可以指定生成秘钥的长度,一般推荐使用1024bit, 1024bit的rsa公钥,加密数据时,最多只能加密117byte的数据),数据量超过这个数,则需要对数据进行分段加密,但是目前1024bit长度的秘钥已经被证明了不够安全,尽量使用2048bit长度的秘钥.2048bit长度的秘钥,最多245byte长度的数据 计算公式如下: 秘钥

C#微信公众号开发系列教程三(消息体签名及加解密)

  C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太忙,样稿一直没有给他,感觉挺愧疚了.真心希望能帮一下迷茫的

Java加解密与签名

加密.数字签名基本概念: 加密: 密码常用术语: 明文,密文,加密,加密算法,加密秘钥,解密,解密算法,解密秘钥,密码分析:分析密文从而推断出明文或秘钥的过程主动攻击:入侵密码系统,采用伪造,修改,删除等手段向系统注入假消息进行欺骗.(对密文有破坏作用)被动攻击:对一个保密系统采取截获密文并对其进行分析和攻击.(对密文没有破坏作用)密码体制:由明文/密文/密钥空间,加密算法和解密算法五部分构成密码协议:也称安全协议,以密码学为基础的消息交换通信协议密码系统:指用于加密.解密的系统.柯克霍夫原则:

curses-键盘编码-openssl加解密【转】

本文转载自;https://zhuanlan.zhihu.com/p/26164115 1.1 键盘编码 按键过程:当用户按下某个键时, 1.键盘会检测到这个动作,并通过键盘控制器把扫描码(scan code)传送到计算机:键盘扫描码跟具体的硬件有关的,不同厂商对同一个键的扫描码有可能不同.2.计算机接收到扫描码后,将其交给键盘驱动程序:3.键盘驱动程序把这个扫描码转换为键盘虚拟码:虚拟码与具体硬件无关,不同厂商的键盘,同一个键的虚拟码总是相同的.然后,键盘驱动程序把该键盘操作的扫描码和虚拟码以

eos中签名验签流程和eosjs中的加解密原理

关键词:eos 签名 验签 ecc dsa 加密 解密 eosjs aes 本文主要探讨两方面 1.eosjs中用密钥对进行加解密功能 2.eos中密钥对生成,签名和验签过程(私钥签名 公钥验签) 常用的加密算法 对称性加密算法 对称式加密就是加密和解密使用同一个密钥,信息接收双方都需事先知道密匙和加解密算法,之后便是对数据进行加解密了.对称加密算法用来对敏感数据等信息进行加密. 对称性加密算法有:AES.DES.3DES DES(Data EncryptionStandard):数据加密标准,