标签: salt

如果存储在数据库中,使用salt如何使密码更安全?

我目前正在学习Rails,但答案不一定是Rails特定的.

所以,据我所知,安全密码系统的工作原理如下:

  • 用户创建密码
  • 系统使用加密算法(例如SHA2)加密密码.
  • 在数据库中存储加密密码的哈希值.

登录尝试后:

  • 用户尝试登录
  • 系统使用相同的加密算法创建尝试哈希
  • 系统将尝试的哈希与数据库中的密码哈希进行比较.
  • 如果匹配,他们会被允许进入.如果没有,他们必须再试一次.

据我所知,这种方法受到彩虹攻击 - 其中可能发生以下情况.

攻击者可以编写一个基本上尝试每个字符,数字和符号排列的脚本,使用相同的加密算法创建一个哈希值,并将它们与数据库中的哈希值进行比较.

因此,围绕它的方法是将哈希与唯一的盐结合起来.在许多情况下,用户注册的当前日期和时间(低至毫秒).

但是,此salt存储在数据库列'salt'中.

所以我的问题是,这是如何改变这样一个事实:如果攻击者首先获得了对数据库的访问权并且为"真实"密码创建了哈希并且还具有盐的哈希值,那么这又不仅如此受彩虹袭击?因为,理论上他会尝试每个排列+盐哈希,并将结果与​​密码哈希进行比较.可能需要更长时间,但我不知道它是多么万无一失.

原谅我的无知,我只是在学习这些东西,这对我来说从来没有多大意义.

encryption passwords cryptography salt

13
推荐指数
2
解决办法
2897
查看次数

网络应用密码:bcrypt和SHA256(以及scrypt)

随着最近(例如LinkedIn)关于密码的讨论,我正在研究密码哈希实现.喝完两杯咖啡和早上读书后,我不再是一个密码学家了.我真的不想假装自己.

具体问题

  1. 使用整数唯一用户ID失败是否有效?(crypt()只使用16位?)

  2. 如果我只是一遍又一遍地在哈希上运行sha256(),直到一秒钟用完就能击败蛮力攻击?

  3. 如果我必须问这些问题我应该使用bcrypt吗?

讨论/说明:

目标很简单,如果我的用户的哈希密码被泄露了:

  1. 破解不会"容易"
  2. 破解一个密码不会暴露使用相同密码的其他用户).

我在#1中读到的是哈希计算必须是昂贵的 - 例如,计算一两秒或者可能需要一点或内存(以阻止硬件解密).

bcrypt有这个内置的,如果我理解正确的话,scrypt更具有前瞻性,并且包含最低内存使用要求.

但是,通过"重新散布"sha256()的结果,需要多次使用几秒钟,然后将最终循环计数与哈希值一起存储以便稍后检查提供的密码,这是一种同样有效的方法吗?

对于#2,为每个密码使用唯一的盐很重要.目前尚不清楚的是盐必须是随机的(或大的).如果目标是避免使用"mypassword"作为密码的每个人拥有相同的哈希,那么仅仅这样做是不够的?:

hash = sha256_hex( unique_user_id + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)

甚至这个,虽然我不确定它会给我什么:

hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)

使用用户ID可以看到的唯一好处,除了我知道它是唯一的,是避免必须保存盐与哈希.没有多大优势.使用用户的ID作为盐是否存在真正的问题?它没有完成#2吗?

我假设如果有人可以窃取我的用户的哈希密码,那么我必须假设他们可以得到他们想要的任何东西 - 包括生成哈希的源代码.那么,在散列之前向密码添加额外的随机字符串(相同的字符串)是否有任何好处?那是:

# app_wide_string = one-time generated, random 64 7-bit *character* string.
hash = sha256_hex( unique_user_id + app_wide_string + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)

我已经看到了这个建议,但我不明白我从那个用户的盐中得到了什么.如果有人想强行攻击他们会知道"app_wide_string"并在运行他们的字典攻击时使用它,对吗?

如上所述,是否有充分的理由使用bcrypt滚动我自己?也许我问这些问题的理由足够了吗?

顺便说一句 - 我只是计算了我现有的散列函数和我的笔记本电脑,我每秒可以生成大约7000个哈希值.不太经常建议的一两秒钟.

一些相关链接:

使用sha256作为散列和使用用户ID进行腌制

SHA512与Blowfish和Bcrypt

用户密码盐的最佳长度是多少?

encryption passwords hash salt bcrypt

13
推荐指数
1
解决办法
8442
查看次数

盐如何在Rails的has_secure_password中工作

根据我从盐析中理解的更加安全的加密密码,我会生成一个随机数(盐)并将其与散列密码一起存储在用户记录中(例如).我会将盐与明文连接起来密码,然后加密(哈希).产生的哈希将难以破解.将重复此过程以验证密码.

看看has_secure_passwordbcrypt_ruby(披露:我不是安全专家)我不知道如何做到这一点,因为用户记录中存储的唯一内容是哈希密码.盐在哪里?

ruby security ruby-on-rails salt

13
推荐指数
1
解决办法
7031
查看次数

laravel密码盐存储在哪里?

Laravel用于bcrypt散列密码.

根据这篇文章,在该过程的某个时刻,该Hash::make函数创建并使用22长度的随机字符串作为盐来生成密码.

对于单个不同的密码,Hash::make确实返回唯一的哈希值,暗示它确实在流程中的某处使用某种盐析.

但是这些盐并没有存储在用户表中,我希望它们存在于用户表中.laravel如何知道用于验证密码的相应哈希?

Laravel Hash解释

php passwords hash salt laravel

13
推荐指数
1
解决办法
1万
查看次数

如何在现有密码哈希值中加盐?

我有一个散列密码的数据库,在散列之前没有添加盐.我想在新密码中加盐.显然我无法重新哈希现有的哈希.

您将如何迁移到新的哈希系统?

migration security passwords salt

12
推荐指数
2
解决办法
7770
查看次数

我误解了哈希盐是什么吗?

我正在努力为我们的代码库添加哈希摘要生成功能.我想使用String作为哈希盐,以便可以将预先知道的密钥/密码短语添加到需要进行哈希处理的任何内容中.我误解了这个概念吗?

hash salt

12
推荐指数
1
解决办法
4790
查看次数

用PHP生成一个salt

在PHP中生成加密安全32字节盐的最佳方法是什么,而不依赖于典型PHP安装中很少包含的库?

经过一些谷歌搜索后,我发现它mt_rand不够安全,但我没有找到更换的建议.一篇文章建议阅读,/dev/random但不仅仅是这不适用于Windows; 它也慢.

我希望在安全性和速度之间取得合理的平衡(即,生成512字节不应该花费20秒,就像/dev/random通常那样)

php random cryptography salt

12
推荐指数
3
解决办法
3万
查看次数

盐,密码和安全

我已经阅读了很多有关此问题的问题,但许多答案相互矛盾或者我不理解.

您应该始终将密码存储为哈希,而不是纯文本.但是,您应该在数据库中的散列密码+ salt旁边存储salt(每个用户都是唯一的).这对我来说似乎不是很聪明,因为无法有人访问数据库,查找称为Admin或其他任何帐户,然后从中计算出密码?

security passwords salt

12
推荐指数
2
解决办法
2029
查看次数

使用Code Igniter存储密码最安全的方法是什么?

我正在为我当前的项目使用Code Igniter.

截至目前,我正在使用MD5进行密码散列,但我已经在很多地方阅读过,这样做并不是一个好习惯.

我该怎么办?

  1. 使用
  2. 或者我应该使用bcrypt

另外,如果建议使用bcrypt,那么如何将它与Code Igniter一起使用?

编辑

我把这些文件放进去了 application/libraries

  1. PasswordHash.php
  2. C/Makefile文件
  3. C/crypt_private.c

在我的控制器中,我使用此代码 -

$params = array(
       'phpass_hash_strength' => 8,
           'phpass_hash_portable' => FALSE
       );
$this->load->library('PasswordHash', $params);
$password = $this->passwordhash->HashPassword($pwd);
Run Code Online (Sandbox Code Playgroud)

我收到这些错误 -

A PHP Error was encountered

Severity: Notice

Message: Uninitialized string offset: 3

Filename: libraries/PasswordHash.php

Line Number: 116
Run Code Online (Sandbox Code Playgroud)
A PHP Error was encountered

Severity: Warning

Message: strpos() [function.strpos]: Empty delimiter

Filename: libraries/PasswordHash.php

Line Number: 116
Run Code Online (Sandbox Code Playgroud)

更新

现在PasswordHash.php使用SimpleLoginSecure删除了.

codeigniter salt password-protection bcrypt password-hash

12
推荐指数
2
解决办法
2万
查看次数

如何使用PKCS5_PBKDF2_HMAC_SHA1()

我正在尝试使用PKCS5_PBKDF2_HMAC_SHA1(),以下是我的示例程序.我想确定我的结果PKCS5_PBKDF2_HMAC_SHA1()是否正确所以我通过网站http://anandam.name/pbkdf2/验证了相同的结果,我看到了不同的结果.我正确使用API​​吗?

如果我正确地传递盐值,我有疑问.

我在程序后粘贴了我的结果和网站结果.

请帮我理解这个.

#include <stdio.h>     
#include <types.h> 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

#include <malloc.h> 

#include <openssl/hmac.h> 
#include <openssl/evp.h> 
#include <openssl/engine.h> 
#include <openssl/aes.h>
#include <openssl/rand.h> 

#include <proto.h> 
#define KEY_LEN    32// 32 bytes - 256 bits 
#define KEK_KEY_LEN   5 
#define ITERATION   1000 

unsigned char salt_value[KEY_LEN]; 
unsigned char AESkey[KEY_LEN]; 
unsigned char XTSkey[KEY_LEN]; 
u8 fuse_key[KEY_LEN]; 

void main() 
{ 
    s32 i=0; 
    s32 len =0; 
    u8 *out; 
    u8 *rspHMAC; 
    const s8 pwd[] = "test"; 
    s8 rspPKCS5[KEK_KEY_LEN * 2]; …
Run Code Online (Sandbox Code Playgroud)

openssl salt pbkdf2

12
推荐指数
1
解决办法
2万
查看次数