char *crypt(const char *key, const char *salt);
Run Code Online (Sandbox Code Playgroud)
返回值:返回指向加密密码的指针.出错,NULL返回.
由于除非给出key和salt,否则返回值是未知的,这应该是动态分配的内存,但valgrind不同意.
在从Zend Server CE 5.1升级到Zend Server CE 5.5期间,PHP也从5.3.5升级到5.3.8.在此转换之后,我正在处理的zend应用程序的登录功能突然中断.
试图调试它,看起来好像执行crypt()不反映PHP手册,或者我误解了它.如果我冒险猜测,那就是后者.
我使用一个16字符长的盐作为较大盐的一部分使用SHA256,它在PHP手册中用作示例.
$password = //string entered at login
$salt = '$5$rounds=250000$1234abcd5678defg$';
Run Code Online (Sandbox Code Playgroud)
在我输入密码后输入密码
$hash = crypt($password, $salt);
Run Code Online (Sandbox Code Playgroud)
我得到一个像这样的字符串作为返回值:
$5$rounds=250000$1234abcd5678$tI.Oiz.YwWjIwT3K.SLU8SwUZ9J0/odBCkbE6t0igeB
Run Code Online (Sandbox Code Playgroud)
令我感到困惑的是16字符盐,它是较大部分的一部分(上面的1234abcd5678defg),现在被截断为12个字符.
这是按预期的吗?该crypt()函数现在似乎比以前返回不同的结果 - 通常是PHP版本之间的?更改日志中没有任何内容表明加密算法有任何根本性的变化.
我在PHP.net上看到MD5没用,他们建议使用crypt + salt.
所以,我去了他们的功能描述并阅读
<?php
$password = crypt('mypassword'); // let the salt be automatically generated
/* You should pass the entire results of crypt() as the salt for comparing a
password, to avoid problems when different hashing algorithms are used. (As
it says above, standard DES-based password hashing uses a 2-character salt,
but MD5-based hashing uses 12.) */
if (crypt($user_input, $password) == $password) {
echo "Password verified!";
}
?>
Run Code Online (Sandbox Code Playgroud)
或者在我的情况下:
$stored_password=fetch_password($user);
if (crypt($_REQUEST['password'],$stored_password)===$stored_password) {
// ok
}
Run Code Online (Sandbox Code Playgroud)
因此,当我看到salt存储在散列密码中并且您使用散列密码作为salt时,我认为Crypt + Salt对于输出上的暴力(黑客成功窃取哈希密码)并不安全.它更安全吗? …
我刚开始学习PHP,我想创建一个登录我最后一年大学项目的网站.我已经读过,在这样的很多地方,河豚是最好的散列方法:openssl_digest vs hash vs hash_hmac?SALT和HMAC之间的区别?
我读到的关于crypt方法的每个地方都包含一个字符串,比如$2y$07$usesomesillystringforsalt$我的主要问题是:我如何随机生成这个?我已经读过时间戳和mt_rand()不安全的地方.
我也听说AES是最近的首选技术,但从我看来,在PHP中实现它似乎相当棘手!河豚仍然是保护存储密码的可接受方法吗?
我目前正在玩一本名为Violent Python的例子.你可以在这里看到我的实现
我现在正在尝试在Go中实现相同的脚本以比较性能,请注意我对Go来说是全新的.打开文件并遍历这些行很好,但是我无法弄清楚如何使用"加密"库以与Python的crypt.crypt(str_to_hash,salt)相同的方式对字符串进行散列.我觉得它可能就像
import "crypto/des"
des.NewCipher([]byte("abcdefgh"))
Run Code Online (Sandbox Code Playgroud)
但是,没有雪茄.任何帮助都会非常感激,因为将Go的并行性能与Python的多线程性能进行比较会非常有趣.
这是我第一次在PHP中使用crypt()函数,我无法弄清楚它为什么不起作用.我的代码基于这篇文章:http://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274
function blowfishHash ($pw) {
//generate random salt
$salt = "$2y$10$";
for ($i = 0; $i < 22; $i++) {
$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
}
$hash = crypt($pw, $salt);
//printout to file
$file = fopen("debug.txt", "w+");
fwrite($file, "\n\n\n".$pw);
fwrite($file, "\n\n\n".$salt);
fwrite($file, "\n\n\n".$hash);
fclose($file);
return $hash;
}
Run Code Online (Sandbox Code Playgroud)
我使用示例密码"password"调用了该函数.
由此产生的盐是:$2y$10$NzRQNjTRfP4jXKvb4TCO.G
但密码是"$2mV0NZp92R3g"- 这似乎太短了.
有人可以帮我弄清楚我做错了什么吗?
在线的所有示例都显示了如下所示的crypt的使用:
$pass = crypt('something','$6$rounds=5000$anexamplestringforsalt$');
Run Code Online (Sandbox Code Playgroud)
但是每个人都说你不应该定义轮次或盐.
那我该怎么用呢?
另外我遇到了一个问题:当我运行上面的代码时,它只运行50轮而不是5000轮,就像系统停止它一样.
任何帮助将不胜感激.
// - 解决方案 - //
我发现其中一些有用:
用于生成盐:
$salt = substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345??6789"), 0, 8);
Run Code Online (Sandbox Code Playgroud)
要么
如果你有一个linux服务器,这是一种更随机的生成盐的方法
$fp = fopen('/dev/urandom', 'r');
$randomString = fread($fp, 32);
fclose($fp);
Run Code Online (Sandbox Code Playgroud)
Base 64编码以确保某些字符不会导致crypt出现问题
$salt = base64_encode($randomString);
Run Code Online (Sandbox Code Playgroud)
对于哈希:
$hashed = crypt($passwordInput, '$6$'.$salt);
Run Code Online (Sandbox Code Playgroud)
确认:
if (crypt($passwordInput, $hashed) == $hashed) {
// Valid action
} else {
// Invalid action
}
Run Code Online (Sandbox Code Playgroud)
**特别感谢@ lathspell帮助我们解决上述问题**
一种建议的运行作业的方法是在属性文件中保存上下文参数.像这个:
#
#Wed Dec 16 18:23:03 CET 2015
MySQL_AdditionalParams=noDatetimeStringSync\=true
MySQL_Port=3306
MySQL_Login=root
MySQL_Password=secret_password_to_cipher
MySQL_Database=talend MySQL_Server=localhost
Run Code Online (Sandbox Code Playgroud)
这非常简单实用,但问题在于密码保存清晰.
所以我正在寻找方法来轻松加密.以下是关于密码加密技术的Stack溢出中已经讨论过的两个非常有趣的问题:
但它们是Java原生的,我正在寻找更好的Talend集成.我已经在我的Talend工作中尝试了不同的方法:
所有这些技术都在一个教程(法语,抱歉)中描述,解释了如何在Talend中加密密码
但是遇到了另一个问题:用于加密/解密的密钥总是很清楚,所以如果你知道解决这一问题的好方法,我会很乐意进行实验.
我有一个邮件服务器,它使用以下sql在mysql数据库中存储邮箱的密码:
ENCRYPT([PASSWORT], concat(_utf8"$1$", right(md5(rand()), 8), _utf8"$"))
Run Code Online (Sandbox Code Playgroud)
但是数据库中没有存储盐.
现在我需要围绕这个数据库建立一个登录过程,但由于缺少盐,很难比较存储的密码.我注意到,密码哈希以下列形式保存了salt:
$1$[SALT]$[PASSWORD-HASH]
Run Code Online (Sandbox Code Playgroud)
如何创建可比较的密码哈希来构建登录?
Dovecot能够使用存储的密码登录用户,但如何?
在IDLE和Python版本3.3.2中,我尝试调用python模块,如下所示:
hash2 = crypt(word, salt)
Run Code Online (Sandbox Code Playgroud)
我在我的程序顶部导入它,如下所示:
from crypt import *
Run Code Online (Sandbox Code Playgroud)
我得到的结果如下:
Traceback (most recent call last):
File "C:\none\of\your\business\adams.py", line 10, in <module>
from crypt import *
File "C:\Python33\lib\crypt.py", line 3, in <module>
import _crypt
ImportError: No module named '_crypt'
Run Code Online (Sandbox Code Playgroud)
但是,当我adams.py在Ubuntu中使用Python 2.7.3 执行相同的文件时,它执行完美 - 没有错误.
我尝试了以下解决Windows和Python 3.3.2的问题(虽然我确定操作系统不是问题,Python版本或我使用的语法是问题):
Python33目录重命名Lib为libcrypt.py中lib来_crypt.py.然而,事实证明整个crypt.py模块依赖于一个外部模块_crypt.py._crypt.py 它不是Python,对吗?这是我...(?)我正在使用语法导入和使用2.7.3中可接受但不在3.3.2中的外部模块.或者我在3.3.2中发现了一个错误?