求助:asp.net程序 对用户密码md5(md5($password).$salt)加密
一个简单的用户注册和登录的页面,就两个部分。
涉及到数据库,存储用户数据(注册),读出用户数据(登录验证)。
搞清楚如何用python连接和操作数据库即可,还有了解sql数据库语句,sqlite和mysql差不多的,看几眼多试几下就了解了。
网站程序,前端如何发送表单(别告诉这你也不清楚?)后端获取用户发送的请求,和数据库中数据验证是否能够登录,然后登录后如何保存用户登录信息,就是使用的cookie,不过在flask中是session(其实session也是cookie,flask把它封装了下,成了加密的cookie)总之如果你认真跟着官方的教程走过一遍。
只是完成用户登录和注册的功能都不难的。
虽然这些知识点都不烂,但是覆盖范围还比较广泛。
数据库,前端的html,后端的程序框架,你对其中一项不太了解都会让你有种无法下手的感觉。
好吧。
丢一段验证登录代码上来,因为flask的路由是通过绑定一个个函数来实现的,如果你要在给每个路由都添加一段验证登录的代码还是蛮麻烦的,不过通过装饰器这个功能实现起来还是蛮方便的。
。
各位用php将密码存入数据库,都用什么方法进行加密的
题主你可以使用 md5 或者 sha1 进行初步处理,但为了更加安全,请你同时加上两个 salt,一个静态 salt,一个动态的 salt。
以 md5 为例:假设通过 POST 传来的密码为 $_POST['password'],在存入 DB 前先进行如下的操作:$password = hash('md5', $_POST['password'].$staticSalt.$dynamicSalt);为了保证动态 salt 的唯一性,可以这样操作:$dynamicSalt = hash('md5', microtime());对于动态的 salt 可以与生成的密码一起保存在 DB 中,而静态 salt 则可以直接放在类文件中(例如定义为一个静态属性即可)。
首先谢谢题主采纳了我的答案,但是我之前的回答并不是最佳答案,之所以有此加密的想法源于自己所读的源码可能比较老,所以并没使用上较新版本的加密方法,例如 bcrypt等。
此外,第二点,感谢评论中几位前辈的提点,已经明白设置静态 salt 的意义并不大,生成一个较长的动态 salt 已然可以解决问题。
LZ应该采用加盐HASH。
如何“腌制”密码呢?=_,=正确的格式应该是,用户password+动态的salt动态的salt不能像2L所说的,使用microtime,因为时间在某些情况下不够随机,而且是可能被猜解的。
这里推荐一个我用的加盐HASH$salt=base64_encode(mcrypt_create_iv(32,MCRYPT_DEV_RANDOM));$password=sha1($register_password.$salt);解释:首先使用mcrypt,产生电脑随机生成的,专门用户加密的随机数函数。
第二步,把得到的随机数通过base64加密,使其变长并且不利于猜解。
第三步,把得出的盐拼接到密码的后面,再对其使用sha1进行哈希再把password存入到用户的数据库。
PS:为何不用静态的salt?没有必要,使用一个动态随机足够长的盐足矣。
为何不用MD5?因为长度不够。
为何没有使用多次HASH?因为这样反而容易发生碰撞。
HASH好之后怎么使用“腌制”好的密码?用户注册->;提交密码->;产生salt->;腌制好的密码存入数据库->salt存入数据库。
用户登录->;提交密码->;调用salt接到提交密码的后面->;进行HASH->;调用之前注册腌制好的密码->;对比HASH值是否和这个密码相同
vb中用变量作为程序的密码会被破解吗?
字符串数据是被写入了程序的, 编码是Unicode. 一些反汇编工具或者调试工具是可以找出你的变量名称的, 当然还有你所给定的值. 所以你的代码并不安全, 你可以通过一些算法将你的密码加密. 然后对此加密的数据... 这样会安全很多, 如果还认为不安全可以加壳保护.一般别人会将两种方法结合在一起...如果有需要, 我可以给你个参考... ^_^
如何保证用户登录时提交密码已经加密
如何保证用户登陆时提交密码已经加密?密码是否已加密,需要客户端和服务端建立约定,双方按约定办事就行了。
这里提到的另一个问题是,如何保证传输安全?最理想的方案当然是走 HTTPS 协议. HTTPS在理论上是可靠的,但在国内会打一些折扣:你可以随便找一台电脑看看有没有安装商业公司或机构的根证书,这些根证书为线路某节点成为中间人提供了可能性;同时,在木马横行的年代,密码在加密提交前可能就被拿到了,此时HTTPS成了摆设,这是为什么国内流行密码控件的一个重要原因。
从成本和需求上考虑,对于众多对安全性要求不高的个人网站,仍然可以考虑采用HTTP 传输,密码提交前通过 JavaScript 加密。
由于JavaScript代码暴露在客户端,因此一般通过不可逆的加密方法加密密码,而对于任何摘要式的加密算法,都可以通过类似md5 字典的方式直接查表获知弱密码,所以要混入salt以增加制作字典的成本。
可想而知,解密只是时间成本的问题。
因此这里的重要前提是“对安全性要求不高”。
如何验证密码呢?一个可行的方法是,客户端提交md5(password)密码(如上所述,此方法只是简单保护了密码,是可能被查表获取密码的)。
服务端数据库通过md5(salt+md5(password)) 的规则存储密码,该 salt仅存储在服务端,且在每次存储密码时都随机生成。
这样即使被拖库,制作字典的成本也非常高。
密码被 md5() 提交到服务端之后,可通过 md5(salt +form['password'])与数据库密码比对。
此方法可以在避免明文存储密码的前提下,实现密码加密提交与验证。
这里还有防止 replay攻击(请求被重新发出一次即可能通过验证)的问题,由服务端颁发并验证一个带有时间戳的可信token (或一次性的)即可。
当然,传输过程再有 HTTPS 加持那就更好了。
最后,为什么要密码控件?原因之一是上面说的,要防止密码在提交前被截获。
如何使用Python 3的两个库来加解密字符串
哈希如果需要用到安全哈希算法或是消息摘要算法,那么你可以使用标准库中的 hashlib 模块。
这个模块包含了符合 FIPS(美国联邦信息处理标准)的安全哈希算法,包括 SHA1,SHA224,SHA256,SHA384,SHA512 以及 RSA 的 MD5 算法。
Python 也支持 adler32 以及 crc32 哈希函数,不过它们在 zlib 模块中。
哈希的一个最常见的用法是,存储密码的哈希值而非密码本身。
当然了,使用的哈希函数需要稳健一点,否则容易被破解。
另一个常见的用法是,计算一个文件的哈希值,然后将这个文件和它的哈希值分别发送。
接收到文件的人可以计算文件的哈希值,检验是否与接受到的哈希值相符。
如果两者相符,就说明文件在传送的过程中未经篡改。
让我们试着创建一个 md5 哈希:>>> import hashlib >>> md5 = hashlib.md5() >>> md5.update('Python rocks!') Traceback (most recent call last): File "", line 1, in md5.update('Python rocks!') TypeError: Unicode-objects must be encoded before hashing >>> md5.update(b'Python rocks!') >>> md5.digest() b'\x14\x82\xec\x1b#d\xf6N}\x16*+[\x16\xf4w' 让我们花点时间一行一行来讲解。
首先,我们导入 hashlib ,然后创建一个 md5 哈希对象的实例。
接着,我们向这个实例中添加一个字符串后,却得到了报错信息。
原来,计算 md5 哈希时,需要使用字节形式的字符串而非普通字符串。
正确添加字符串后,我们调用它的 digest 函数来得到哈希值。
如果你想要十六进制的哈希值,也可以用以下方法:>>> md5.hexdigest() '1482ec1b2364f64e7d162a2b5b16f477' 实际上,有一种精简的方法来创建哈希,下面我们看一下用这种方法创建一个 sha1 哈希:>>> sha = hashlib.sha1(b'Hello Python').hexdigest() >>> sha '422fbfbc67fe17c86642c5eaaa48f8b670cbed1b' 可以看到,我们可以同时创建一个哈希实例并且调用其 digest 函数。
然后,我们打印出这个哈希值看一下。
这里我使用 sha1 哈希函数作为例子,但它不是特别安全,读者可以随意尝试其他的哈希函数。
密钥导出Python 的标准库对密钥导出支持较弱。
实际上,hashlib 函数库提供的唯一方法就是 pbkdf2_hmac 函数。
它是 PKCS#5 的基于口令的第二个密钥导出函数,并使用 HMAC 作为伪随机函数。
因为它支持“加盐(salt)”和迭代操作,你可以使用类似的方法来哈希你的密码。
例如,如果你打算使用 SHA-256 加密方法,你将需要至少 16 个字节的“盐”,以及最少 100000 次的迭代操作。
简单来说,“盐”就是随机的数据,被用来加入到哈希的过程中,以加大破解的难度。
这基本可以保护你的密码免受字典和彩虹表(rainbow table)的攻击。
让我们看一个简单的例子:>>> import binascii >>> dk = hashlib.pbkdf2_hmac(hash_name='sha256', password=b'bad_password34', salt=b'bad_salt', iterations=100000) >>> binascii.hexlify(dk) b'6e97bad21f6200f9087036a71e7ca9fa01a59e1d697f7e0284cd7f9b897d7c02' 这里,我们用 SHA256 对一个密码进行哈希,使用了一个糟糕的盐,但经过了 100000 次迭代操作。
当然,SHA 实际上并不被推荐用来创建密码的密钥。
你应该使用类似 scrypt 的算法来替代。
另一个不错的选择是使用一个叫 bcrypt 的第三方库,它是被专门设计出来哈希密码的。
wordpress能允许用户注册博客吗
一。
研究wordpress时wordpess的密码密码生成与登录密码验证方式很重要 WordPress密码已成为整合的首要目标,如何征服整合,就得了解WordPress密码算法。
WordPress系统的用户密码是保存在wp_users数据表的user_pass字段,密码是通过Portable PHP password hashing framework类产生的,密码的形式是随机且不可逆,同一个明文的密码在不同时间,产生的密文也不一样,相对来说较为安全。
二。
密码生成方式> 随机产生一个salt 并将salt和password相加> 进行了count次md5 然后和encode64的hash数值累加> 最后得到一个以$P$开头的密码,这个密码每次产生的结果都不一样 以下为在wordpress中调用密码生成的代码 [php] view plain copy print?$password = 'abc'; global $wp_hasher; if ( empty($wp_hasher) ) { require_once( './wp-includes/class-phpass.php'); $wp_hasher = new PasswordHash(8, TRUE); } echo $wp_hasher->HashPassword($password); ?> 三。
wordpress密码生成与登录验证 wordpress中位置为\wp-includes\class-phpass.php 以下是wordpress中生成密码的代码直接运行可查看密码的生成以及验证过程 [php] view plain copy print?class PasswordHash { var $itoa64; var $iteration_count_log2; var $portable_hashes; var $random_state; function PasswordHash($iteration_count_log2, $portable_hashes) { $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; if ($iteration_count_log2 4 || $iteration_count_log2 > 31) $iteration_count_log2 = 8; $this->iteration_count_log2 = $iteration_count_log2; $this->portable_hashes = $portable_hashes; $this->random_state = microtime() . uniqid(rand(), TRUE); // removed getmypid() for compability reasons } function get_random_bytes($count) { $output = ''; if ( @is_readable('/dev/urandom') && ($fh = @fopen('/dev/urandom', 'rb'))) { $output = fread($fh, $count); fclose($fh); } if (strlen($output) $output = ''; for ($i = 0; $i $this->random_state = md5(microtime() . $this->random_state); $output .= pack('H*', md5($this->random_state)); } $output = substr($output, 0, $count); } return $output; } function encode64($input, $count) { $output = ''; $i = 0; do { $value = ord($input[$i++]); $output .= $this->itoa64[$value & 0x3f]; if ($i $value |= ord($input[$i]) $output .= $this->itoa64[($value >> 6) & 0x3f]; if ($i++ >= $count) break; if ($i $value |= ord($input[$i]) $output .= $this->itoa64[($value >> 12) & 0x3f]; if ($i++ >= $count) break; $output .= $this->itoa64[($value >> 18) & 0x3f]; } while ($i return $output; } function gensalt_private($input) { $output = '$PXXXXX; $output .= $this->itoa64[min($this->iteration_count_log2 + ((PHP_VERSION >= '5') ? 5 : 3), 30)]; $output .= $this->encode64($input, 6); return $output; } function crypt_private($password, $setting) { $output = '*0'; if (substr($setting, 0, 2) == $output) $output = '*1'; $id = substr($setting, 0, 3); # We use "$P{1}quot;, phpBB3 uses "$H{1}quot; for the same thing if ($id != '$PXXXXX && $id != '$HXXXXX) return $output; $count_log2 = strpos($this->itoa64, $setting[3]); if ($count_log2 7 || $count_log2 > 30) return $output; $count = 1 $salt = substr($setting, 4, 8); if (strlen($salt) != 8) return $output; # We're kind of forced to use MD5 here since it's the only # cryptographic primitive available in all versions of PHP # currently in use. To implement our own low-level crypto # in PHP would result in much worse performance and # consequently in lower iteration counts and hashes that are # quicker to crack (by non-PHP code). if (PHP_VERSION >= '5') { $hash = md5($salt . $password, TRUE); do { $hash = md5($hash . $password, TRUE); } while (--$count); } else { $hash = pack('H*', md5($salt . $password)); do { $hash = pack('H*', md5($hash . $password)); } while (--$count); } $output = substr($setting, 0, 12); $output .= $this->encode64($hash, 16); return $output; } function gensalt_extended($input) { $count_log2 = min($this->iteration_count_log2 + 8, 24); # This should be odd to not reveal weak DES keys, and the # maximum valid value is (2**24 - 1) which is odd anyway. $count = (1 $output = '_'; $output .= $this->itoa64[$count & 0x3f]; $output .= $this->itoa64[($count >> 6) & 0x3f]; $output .= $this->itoa64[($count >> 12) & 0x3f]; $output .= $this->itoa64[($count >> 18) & 0x3f]; $output .= $this->encode64($input, 3); return $output; } function gensalt_blowfish($input) { # This one needs to use a different order of characters and a # different encoding scheme from the one in encode64() above. # We care because the last character in our encoded string will # only represent 2 bits. While two known implementations of # bcrypt will happily accept and correct a salt string which # has the 4 unused bits set to non-zero, we do not want to take # ...
MD5可以直接放到数据里面用吗?
直接放进去,就是取出验证的时候需要反转一下 String pw = EncryptionUtils.encryptByMD5(password, userName, false); 。
。
。
。
String encryptByMD5(String str,String salt,boolean is64){Md5PasswordEncoder md5 = new Md5PasswordEncoder();md5.setEncodeHashAsBase64(is64);return md5.encodePassword(str, salt);}
linux openssl
UserStatusEditor.java类,负责转换枚举与String public class UserStatusEditor extends PropertyEditorSupport {@Overridepublic void setAsText(final String text) throws IllegalArgumentException {setValue(UserStatus.valueOf(text));}@Overridepublic void setValue(final Object value) {super.setValue(UserStatus.valueOf(value.toString()));}@Overridepublic UserStatus getValue() {return (UserStatus) super.getValue();}@Overridepublic String getAsText() {return getValue().name();}}UserBeanPropertyRowMapper.java类,将自己的扩展类加进去 public class UserBeanPropertyRowMapperextends BeanPropertyRowMapper{@Overrideprotected void initBeanWrapper(BeanWrapper bw) {super.initBeanWrapper(bw);bw.registerCustomEditor(UserStatus.class, "status", new UserStatusEditor()); }}UserDaoImpl.java类,负责查询 @Repository(value = "userDao")public class UserDaoImpl extends BaseDao implements UserDao {@Overridepublic User getUserByEmail(String email) {String sql = "SELECT u.user_id userId,u.email email,u.password password,u.salt salt,u.status status FROM user u WHERE u.email=?";ListuserList = getJdbcTemplate().query(sql, UserBeanPropertyRowMapper.newInstance(User.class), email);if (userList != null && !userList.isEmpty()) {return userList.get(0);}return null;}}
转载请注明出处51数据库 » password_salt
菊花残满腚伤-一枪热流穿断肠