编码,加解密,签名,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进制 | &# | < |
| html实体编码16进制 | &#x | < |
| 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编码加密为例
三: 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是否相同。如果相同则密码正确。反之则密码错误。
编码,加解密,签名,Hash的更多相关文章
- RSA 加解密 签名 示例
import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStrea ...
- iOS RSA加解密签名和验证
转自:http://www.jianshu.com/p/81b0b54436b8 Pre:在公司负责了一个项目,需要用到iOS RSA验证签名的功能.后台给我的仅仅是一个公钥的字符串.经过起初的一段时 ...
- Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战
一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...
- python实现RSA加密和签名以及分段加解密的方案
1.前言 很多朋友在工作中,会遇到一些接口使用RSA加密和签名来处理的请求参数,那么遇到这个问题的时候,第一时间当然是找开发要加解密的方法,但是开发给加解密代码,大多数情况都是java,c++,js等 ...
- C#微信公众号开发系列教程三(消息体签名及加解密)
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...
- 使用非对称算法RSA实现加解密和使用签名算法SHA1WithRSA、MD5withRSA生成签名以及验签
不啰嗦,直接上源码 package com.hudai.platform.manager.util; import java.io.ByteArrayOutputStream; import java ...
- curses-键盘编码-openssl加解密【转】
本文转载自;https://zhuanlan.zhihu.com/p/26164115 1.1 键盘编码 按键过程:当用户按下某个键时, 1.键盘会检测到这个动作,并通过键盘控制器把扫描码(scan ...
- RSA签名,加解密处理核心文件
import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.secur ...
- [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome
Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...
随机推荐
- 套接字I/O模型之WSAEventSelect
今天我又学习了一种新的套接字I/O模型------WSAEventSelect,他与WSAAsyncSelect一样也是一种异步事件通知模型,不同的是WSAAsyncSelect是与窗口句柄关联在一起 ...
- 使用Log Explorer查看和恢复数据
由于一次意外操作,把QC数据库中的BUG表数据给删掉了.崩溃-上网找了下恢复方法,找到一款Log Explorer.下载安装使用后,发现这款软件的确不错,收藏ing. 本次的使用的Log Expl ...
- Leetcode Variant-Plus N
Given a non-negative number represented as an array of digits, plus N to the number. The digits are ...
- 如何写一个漂亮的Liferay Theme 6.2
只要你看到的.想做出来的页面,都可以通过liferay theme来实现,至于具体实现凡方式,那就见仁见智了. 下面,我将介绍如何快速地建一个简单漂亮的liferay theme. 工具:lifera ...
- SSIS 控制流和数据流(转)
理解控制流和数据流的一个入口是看他们如何运行的.一个控制流任务是一个最小的执行单位,它的运行结果有成功,失 败,和完成,在运行它的下一个任务之前必须得到这些结果.在数据流任务中,转换时最基本的元素.一 ...
- HDU 5446 Unknown Treasure Lucas+中国剩余定理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...
- bzoj 1270 DP
w[i,j]代表高度j,第i颗树的时候的最大值 那么w[i,j]:=max(w[i,j+1],w[k,j+heigh])+sum[i,j]: 但是这样枚举是n^3的,我们发现转移的第二个选择w[k,j ...
- 【CodeForces】【338E】Optimize!
线段树 先搞出来每个a[i]能连多少条边记为w[i]……如果对一组s[i],都满足w[i]-rank[i]>=0则这是一组合法方案,然后线段树维护w[i]-rank[i](第一个元素出去的时候后 ...
- centos6.5安装图形界面,windows远程linux图形界面
1. 查询是否已安装图形界面 yum grouplist |more 在grouplist的输出结果中的“Installed Groups:”部分中,如果你能找到“X Window System”和G ...
- 手写PE文件(一)
DOS Header(IMAGE_DOS_HEADER)->64 Byte DOS头部 DOS Stub 112字节 "PE"00(Signature) 4个字节 IMAGE ...