编码,加解密,签名,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 它是一个第三方库,但是已经停止更新,所以 ...
随机推荐
- VS 与 SQLite数据库 连接
SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的.我们需要的sqlite3.lib文件并不在 ...
- springboot注解
@RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(stereotype)注解.它为阅 ...
- 谈谈 Repository、IUnitOfWork 和 IDbContext 的实践
谈谈 Repository.IUnitOfWork 和 IDbContext 的实践 上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext ...
- Why Every Professional Should Consider Blogging
转自http://www.pixelstech.net/article/1327829407-Why-Every-Professional-Should-Consider-Blogging ften ...
- 【转载】MyBatis之传入参数
原文地址:http://blog.csdn.net/liaoxiaohua1981/article/details/6862764 在MyBatis的select.insert.update.dele ...
- 【CentOs】配置nginx
参考资料:http://nginx.org/en/linux_packages.html#stable 1.添加nginx.repo 2.配置nginx 3.启动nginx 1.添加nginx.rep ...
- Poj2420 A Star not a Tree? 模拟退火算法
题目链接:http://poj.org/problem?id=2420 题目大意:每组数据中给n个点(n<=100),求平面中一个点使得这个点到n个点的距离之和最小. 分析:一开始看到这个题想必 ...
- SpringMVC:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax;
今天用SpringMVC做修改添加操作,之前的操作都实现了添加修改,但始终报com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have ...
- ToolStripButton样式
public static class Extensions { public static void SetMouseDownStyle(this ToolStripButton button) { ...
- NYOJ-214 单调递增子序列(二) AC 分类: NYOJ 2014-01-31 08:06 233人阅读 评论(0) 收藏
#include<stdio.h> #include<string.h> int len, n, i, j; int d[100005], a[100005]; int bin ...