编码,加解密,签名,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 它是一个第三方库,但是已经停止更新,所以 ...
随机推荐
- mssql 动态添加数据库用户
USE [master]GOCREATE LOGIN [admin] WITH PASSWORD=N'123456', DEFAULT_DATABASE=[test], CHECK_EXPIRATIO ...
- [shell基础]——if/for/while/until/case 语句
for语句 do echo $loop done ` do echo $loop done for loop in `ls /tmp` do echo $loop done while语句 while ...
- 软件工程随堂小作业——随机四则运算(C++)
一.设计思路: 1.程序的主体部分是循环输出,次数即题目数目由用户输入: 2.三个整型变量+rand函数来实现随机数四则运算,一个变量代表加减乘除,另外两个用作运算数: 3.用户体验:题目分三列,排列 ...
- maven安装报错
今天在安装maven时安照说明配置环境变量,通过命令检查: mvn -v 竟然出现以下错误,很郁闷的是我明明配置了JAVA_HOME,并且别的依赖java的东西都能用,通过java -version也 ...
- struts2异常记录--java.lang.IllegalStateException
java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFa ...
- javascript进行url转义方法比较escape、encodeURI和encodeURIComponent
escape会将除了 ASCII 字母.数字和特定的符号(* @ - _ + . /)以外的字符全部进行转义编码,因此如果想对URL编码,最好不要使用此方法,因为它会让你的URL变的不可读. 提示:E ...
- CocoaPods最佳实践探讨
近期在项目中首次使用了CocoaPods.从软件工程的角度来看,我对目前常见的CocoaPods使用方法有些意见,建议做一些改进.先说一下我建议的最佳实践,后面再分析为什么要这样做.并且希望大家根据自 ...
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- 8大排序算法图文讲解 分类: Brush Mode 2014-08-18 11:49 78人阅读 评论(0) 收藏
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序. ...
- angularJs 问题
1. IE不能渲染指令中的 style="background-color",而chrome和firefox可以 <!DOCTYPE html> <html ng ...