• 如何安全的存储用户密码?


      原文链接:请猛击

    本文我只截取了一小部分知识,请看原文。

    一:基础知识:加盐哈希( Hashing with Salt)

    我们已经知道,恶意攻击者使用查询表和彩虹表,破解普通哈希加密有多么快。我们也已经

    了解到,使用随机加盐哈希可以解决这个问题。但是,我们使用什么样的盐值,又如何将其

    混入密码中?

    盐值应该使用加密的安全伪随机数生成器( Cryptographically Secure Pseudo-Random

    Number Generator,CSPRNG )产生。CSPRNG和普通的伪随机数生成器有很大不同,

    如“ C ”语言的rand()函数。顾名思义, CSPRNG 被设计成用于加密安全,这意味着它能提

    供高度随机、完全不可预测的随机数。我们不希望盐值能够被预测到,所以必须使用 CSPRNG 。

    下表列出了一些当前主流编程平台的 CSPRNG 方法。 

    PlatformCSPRNG
    PHP mcrypt_create_iv, openssl_random_pseudo_bytes
    Java java.security.SecureRandom
    Dot NET (C#, VB) System.Security.Cryptography.RNGCryptoServiceProvider
    Ruby SecureRandom
    Python os.urandom
    Perl Math::Random::Secure
    C/C++ (Windows API) CryptGenRandom
    Any language on GNU/Linux or Unix Read from /dev/random or /dev/urandom

    每个用户的每一个密码都要使用独一无二的盐值。用户每次创建帐号或更改密码时,密码应采用一个新的随机盐值。

    永远不要重复使用某个盐值。这个盐值也应该足够长,以使有足够多的盐值能用于哈希加密。一个经验规则是,盐

    值至少要跟哈希函数的输出一样长。该盐应和密码哈希一起存储在用户帐号表中。

    存储密码的步骤:

    1. 使用 CSPRNG 生成足够长的随机盐值。

    2. 将盐值混入密码,并使用标准的密码哈希函数进行加密,如Argon2、 bcrypt 、 scrypt 或 PBKDF2 。

    3. 将盐值和对应的哈希值一起存入用户数据库。

    校验密码的步骤:

    1. 从数据库检索出用户的盐值和对应的哈希值。

    2. 将盐值混入用户输入的密码,并且使用通用的哈希函数进行加密。

    3. 比较上一步的结果,是否和数据库存储的哈希值相同。如果它们相同,则表明密码是正确的;否则,该密码错误。

  • 相关阅读:
    2.谈谈算法
    1.数据结构和算法笔记
    初次使用博客
    Unity中关于在一个场景中使用多个摄像机
    基于unity的单例设计模式写法
    unity3D读取Txt文件中信息
    转载雨松的unity中使用ITween插件和ITweenPath
    Unity3D游戏开发之数据持久化PlayerPrefs的使用
    [转载]Unity3d更改3d Text的字体的材质球的shader,使字体不显示
    C#写的Socket Server端在unity运行时和关闭时没事,但是在打开直接unity崩溃问题
  • 原文地址:https://www.cnblogs.com/zhangxiaoliu/p/6965213.html
Copyright © 2020-2023  润新知