Index: wp-login.php
===================================================================
--- wp-login.php	(revision 21282)
+++ wp-login.php	(working copy)
@@ -221,6 +221,8 @@
 		do_action('retrieve_password_key', $user_login, $key);
 		// Now insert the new md5 key into the db
 		$wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login));
+		// Schedule key expiration to one week
+		wp_schedule_single_event(strtotime('+7 days'), 'clear_password_reset_key', array($user_data->ID));
 	}
 	$message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n";
 	$message .= network_home_url( '/' ) . "\r\n\r\n";
@@ -248,6 +250,31 @@
 }
 
 /**
+ * Clear password reset key
+ *
+ * @since 3.4.1
+ * @uses $wpdb WordPress Database object
+ *
+ * @param int $user_id User ID
+ * @return bool|WP_Error True: when finish. WP_Error on error
+ */
+function wp_clear_password_reset_key($user_id) {
+	global $wpdb;
+
+	if ( empty($user_id) )
+		return new WP_Error('invalid_user_id', __('Invalid User ID'));
+
+	$user = get_userdata($user_id);
+
+	if ( $user === false )
+		return new WP_Error('invalid_user', __('Invalid user'));
+
+	$wpdb->update($wpdb->users, array('user_activation_key' => ''), array('ID' => $user->ID) );
+
+	return true;
+}
+
+/**
  * Retrieves a user row based on password reset key and login
  *
  * @uses $wpdb WordPress Database object
Index: wp-includes/default-filters.php
===================================================================
--- wp-includes/default-filters.php	(revision 21282)
+++ wp-includes/default-filters.php	(working copy)
@@ -213,6 +213,7 @@
 add_action( 'wp_print_footer_scripts', '_wp_footer_scripts'                 );
 add_action( 'init',                'check_theme_switched',            99    );
 add_action( 'after_switch_theme',  '_wp_sidebars_changed'                   );
+add_action( 'clear_password_reset_key', 'wp_clear_password_reset_key'       );
 
 if ( isset( $_GET['replytocom'] ) )
     add_action( 'wp_head', 'wp_no_robots' );
Index: wp-includes/pluggable.php
===================================================================
--- wp-includes/pluggable.php	(revision 21282)
+++ wp-includes/pluggable.php	(working copy)
@@ -1564,6 +1564,7 @@
 
 	$hash = wp_hash_password($password);
 	$wpdb->update($wpdb->users, array('user_pass' => $hash, 'user_activation_key' => ''), array('ID' => $user_id) );
+	wp_clear_scheduled_hook('clear_password_reset_key', array( $user_id ));
 
 	wp_cache_delete($user_id, 'users');
 }
